То, что вы сейчас настроили, я бы сделал. Если команда может быть выполнена или нет, это бизнес-правило, то есть оно должно обрабатываться из ViewModel
, а не View
.
Единственное, что я делаю, - это повышение CanExecuteChanged()
в событии PropertyChange
вашей ViewModel вместо set
метода SelectedAdvisory
void MyViewModel()
{
this.PropertyChanged += MyViewModel_PropertyChanged;
}
void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch(e.PropertyName)
{
case "SelectedAdvisory":
((DelegateCommand)AddAdvisoryCommand).RaiseCanExecuteChanged();
break;
}
}
Я предпочитаю по возможности не использовать логику в моих методах получения / установки, а использование события PropertyChanged
позволяет мне видеть все, что происходит, когда свойства изменяются в одном месте.
Конечно, если вы используете RelayCommand
вместо DelegateCommand
, вам не нужно вручную повышать CanExecuteChanged()
при изменении свойств, поскольку это происходит автоматически.
Вы также можете немного упростить свой XAML, предоставив обоим общим DataContext
. Button
вообще не должен ссылаться на ComboBox
.
<ComboBox
DisplayMemberPath="Name"
ItemsSource="{Binding Path=Advisories}"
SelectedItem="{Binding Path=SelectedAdvisory}" />
<Button Command="{Binding Path=AddAdvisoryCommand}"
CommandParameter="{Binding SelectedAdvisory}"
Content="Add..." />