В WPF у меня есть класс ViewModel под названием Malfunctions, и он имеет ObservableCollection of PartMalfunctions. Как правило, в ObservableCollection существует от 10 до 15 объектов PartMalfunction; сколько из них зависит от других параметров, выходящих за рамки этого вопроса.Какой слой должен содержать ICommand?
У меня есть xaml, у которого есть DataGrid, который привязывается к этому ObservableCollection. В DataGrid я отображаю различные свойства PartMalfuction (т.е. - описание, имя и т. Д.), И у меня есть кнопка Start timer, которую пользователь может щелкнуть. Кнопка таймера запуска привязана к ICommand StopwatchCmd в классе модели PartMalfunction (вы можете увидеть все это ниже в коде).
У меня есть вопрос: У меня есть StopwatchCmd в неправильном слое (т.е. - принадлежит ли он в Mommunctions ViewModel)? Я действительно боролся с этим и пытался разобраться в этом сам, но я продолжаю ударять по стене, так сказать, потому что StopwatchCmd в классе Model отлично работает! Я имею в виду, что он способен выполнять там и выполнять любые бизнес-правила, в которых он нуждается, и взаимодействовать только с этим экземпляром объекта, для которого он запускал. Если я вставлю его в ViewModel, то мне кажется, что мне нужно пройти больше работы, чтобы заставить его делать то, что уже сделано.
Обратите внимание, что я не указал код из Mommunctions ViewModel, поскольку он не имеет отношения к этому вопросу. Вот код для Mommunctions ViewModel.
public class Malfunctions : ViewModelBase {
public ObservableCollection<Model.PartMalfunction> AllPartMalfunctions {
get;
private set;
}
}
Класс Модель PartMalfunction выглядит примерно так:
public class PartMalfunction : INotifyPropertyChanged {
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName) {
if (PropertyChanged != null) {
PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
private int _seconds;
private string _stopwatchText = string.Empty;
private bool _isStopwatchInProgress = false;
System.Windows.Threading.DispatcherTimer _timer = new System.Windows.Threading.DispatcherTimer();
RelayCommand _stopwatchCmd;
public ICommand StopwatchCmd {
get {
if (_stopwatchCmd == null)
_stopwatchCmd = new RelayCommand(param => this.StopwatchClick());
return _stopwatchCmd;
}
}
public bool IsStopwatchInProgress {
get {
return _isStopwatchInProgress;
}
set {
_isStopwatchInProgress = value;
OnPropertyChanged("IsStopwatchInProgress");
}
}
public string StopwatchText {
get {
return _stopwatchText;
}
set {
_stopwatchText = value;
OnPropertyChanged("StopwatchText");
}
}
private void StopwatchClick() {
if (!this.IsStopwatchInProgress) {
// Start the timer
_seconds = 0;
// Will immediately update the timer text to "00:00:00"
this.StopwatchText = GetElapsed();
_timer.Tick += DispatcherTimer_Tick;
_timer.Interval = new TimeSpan(0, 0, 1); // Ticks every second
_timer.Start();
this.IsStopwatchInProgress = true;
}
else {
// Stop the timer
_timer.Stop();
_timer.Tick -= DispatcherTimer_Tick;
_seconds = 0;
this.IsStopwatchInProgress = false;
}
}
private void DispatcherTimer_Tick(object sender, System.EventArgs e) {
_seconds += 1;
this.StopwatchText = GetElapsed();
}
private string GetElapsed() {
int hour = 0, min = 0, sec = 0;
if (_seconds > 59) {
min = (int)_seconds/60;
sec = _seconds % 60;
if (min > 59) {
hour = (int)min/60;
min = min % 60;
}
}
else
sec = _seconds;
string elapsed = hour < 10 ? "0" + hour.ToString() : hour.ToString();
elapsed += ":" + (min < 10 ? "0" + min.ToString() : min.ToString());
elapsed += ":" + (sec < 10 ? "0" + sec.ToString() : sec.ToString());
return elapsed;
}
}
Для меня то, что вы думаете о модели, на самом деле является ViewModel, более конкретно родительский ViewModel (Malfunctions) имеет коллекцию дочерних ViewModels (PartMalfunction), выставленных как коллекция (ObservableCollection), что означает, что нет проблема с свойствами ICommand в классе PartMalfunction. –
AwkwardCoder
@AwkwardCoder - Я понимаю, о чем вы говорите. Так что это действительно может быть проблемой с моим восприятием модели или ViewModel. Не возражаете ли вы поместить свой комментарий в качестве ответа? – Jagd
в порядке, я отвечу на это как ответ, но вопрос может быть воспринят как в первую очередь на основе мнения :) – AwkwardCoder