MVVM мудро помещать свойство IsClicked
в модель представления неправильно. Это просмотр связанных данных и только просмотр связанных. Вы должны попытаться избежать этого, и этого почти всегда можно избежать.
Когда речь идет о представлении, которое запускает операцию модели представления, тогда вам должен прийти в голову шаблон команды.
Но если IsClicked
отражает состояние модели представления, например, IsDataFilterEnabled
, тогда вы можете использовать привязку данных, как предложено другими. Но в этом случае вы выбрали очень плохое имя для вашей Author
собственности. Имя IsClicked и состояние кнопки являются ассоциативными.
Author.xaml.cs
public partial class Author : Window
{
private bool _isClicked;
public bool IsClicked
{
get { return _isClicked; }
set { _isClickedYes= value; }
}
public Author()
{
Mediator.Register("EnableIsClickedProperty", EnableIsClicked);
}
private void EnableIsClicked(object parameter)
{
_isClicked = dialogResult;
// Assuming that AuthorViewModel is the DataContext of the Author view
var viewModel = this.DataContext as AuthorViewModel;
if (_isClicked && viewModel.DoCertainOperationCommand.CanExecute())
{
viewModel.DoCertainOperationCommand.Execute();
}
}
}
AuthorViewModel.cs
public class AuthorViewModel
{
public ICommand DoCertainOperationCommand => new RelayCommand(DoCertainOperation, CanExecuteDoCertainOperation);
private void DoSomething()
{
//this will call the EnableIsClicked method in Author.xaml.cs
Mediator.NotifyCollegue("EnableIsClickedProperty", null);
}
private void DoCertainOperation(object param)
{
// As this method is only invoked by the view when Author.IsClicked == true,
// the view model doesn't need to care about the view's property states.
// IsClicked is UI logic and belongs solely to the view.
}
private bool CanExecuteDoCertainOperation => true;
}
Для краткости я не разместил здесь код для RelayCommand
. У вас уже есть собственная реализация, или вы найдете десятки в web .
. Вы также можете напрямую вызвать API модели представления (из кода).