Изменение значений DataContext в команде в WPF - PullRequest
0 голосов
/ 20 июня 2020

Я хочу изменить значение свойства ViewModel (связанного с DataContext). Очень просто с classi c Events, с Commands это становится сложной задачей. Это мой код:

public partial class MainWindow : Window
    {
        ViewModel _vm = new ViewModel();
        public MainWindow()
        {
            InitializeComponent();

            _vm.BtnClick = new BtnClick();

            DataContext = _vm;
        }
    }

public class BtnClick : ICommand
    {
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            Debug.WriteLine(parameter.ToString());
        }
    }

public class ViewModel
    {
        public ICommand BtnClick { get; set; }
        public string Input { get; set; }
        public string Output { get; set; }
    }
<StackPanel>
        <TextBox Text="{Binding Input}"></TextBox>
        <TextBlock Text="{Binding Output}"></TextBlock>
        <Button Command="{Binding Path=BtnClick}" CommandParameter="{Binding Input}">Translate</Button>
    </StackPanel>

Команда правильно принимает значение из TextBox, теперь я хочу сделать что-то с этим значением и сохранить его в Output. И проблема в том, что с точки зрения команд я не могу получить доступ к DataContext и ViewModel.

1 Ответ

0 голосов
/ 20 июня 2020

Реализация любой команды обычно находится в модели просмотра.

Обычно используется фреймворк или вспомогательный класс.

Например:

https://riptutorial.com/mvvm-light/example/32335/relaycommand

publi c class MyViewModel {.....

public ICommand MyCommand => new RelayCommand(
   () =>
  {
    //execute action
    Message = "clicked Button";
  },
  () =>
  {
    //return true if button should be enabled or not
    return true;
  }

);

Здесь есть анонимный метод с этой "нажатой кнопкой "в нем.

Это захватит переменные в родительской модели просмотра.

Таким образом, вы можете установить свойство publi c в модели просмотра, привязанное к свойству text в вашем представлении.

Чтобы представление ответило, вам необходимо реализовать inotifypropertychanged и поднять свойство, измененное в установщике этого свойства publi c.

https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification.

Из приведенного выше.

Если PersonName был привязан к текстовому блоку в представлении.

  public string PersonName
  {
      get { return name; }
      set
      {
          name = value;
          // Call OnPropertyChanged whenever the property is updated
          OnPropertyChanged();
      }
  }

В команде вы можете сделать:

 PersonName = "Andy";

Что вызывает установщик PersonName и текстовый блок, связанный с PersonName, прочитают новое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...