Как получить доступ к свойству, заданному в codebehind в View Model в WPF MVVM? - PullRequest
0 голосов
/ 19 января 2020

В настоящее время я реализую приложение, используя шаблон WPF MVVM. Там я столкнулся с проблемой, когда я назначаю некоторое свойство (IsClickedYes для true) в codebehind (скажем, Author.xaml.cs), в методе посредника, затем, когда медиатор возвращается к конкретной модели представления (AuthorViewModel.cs), мне нужно для доступа к свойству IsClickedYes, которое находится в Author.xaml.cs из AuthhorViewModel.cs. Как я могу достичь этого?

Author.cs

public class Author
{
    private bool _isClickedYes;

    public bool IsClickedYes
    {
     get { return _isClickedYes; }
     set { _isClickedYes= value; }
    }
    public Author()
    {
    Mediator.Register("SetClickedYesProperty",SetClickedYes);
    }

    private void SetClickedYes(object parameter)
    {
     //Show a Confirm Message Dialog here then if user clicked yes set IsClickedYes property to true

    _isClickedYes=true;
    }
}

AuthorViewModel.cs

public class AuthorViewModel
{
//this will call the SetClickedYes method in Author.xaml.cs
Mediator.NotifyCollegue("SetClickedYesProperty",null);

//then here I need to access the IsClickedYes Property value of Author.xaml.cs 
if IsClickedYes == true , then do a certain operation otherwise do nothing.


}

Если я пытаюсь создать свойство в AuthorViwModel и установить это свойство в codebehind, когда оно возвращается из посредник становится нулевым. Вот почему я создал свойство в codebehind и присвоил ему значение, пытаясь получить к нему доступ из View Model. Как я могу достичь этого, есть ли другой способ, которым я могу достичь этого? Пожалуйста, кто-нибудь поможет мне, если есть какой-нибудь другой более хороший метод для достижения этой цели? Любой совет будет высоко ценится!

Ответы [ 2 ]

0 голосов
/ 19 января 2020

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 модели представления (из кода).

0 голосов
/ 19 января 2020

Я бы порекомендовал, чтобы свойство IsClickedYes было частью вашей модели представления. Если вы передаете модель представления конструктору представления, тогда все становится действительно просто. Вы можете установить значение в своем коде за (все еще), и ваша модель представления всегда будет иметь указатель на значение. Элемент управления в представлении (предположительно, флажок, но, возможно, другой вид переключения?) Может затем привязать свое значение (в двух направлениях) к свойству модели представления. Для этого простого случая на самом деле вообще нет необходимости использовать посредника.

...