提问者:小点点

在WPF中更改命令中DataContext的值


我想更改ViewModel属性的值(它与DataContext绑定)。 与经典事件极其容易,与命令它成为艰巨的任务。 这是我的代码:

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中获取值,现在我想用这个值做一些事情,并将它保存到outputer中。 问题是从命令角度来看,我无法同时访问DataContextViewModel


共1个答案

匿名用户

任何命令的实现通常都在ViewModel中。

通常使用框架或助手类。

例如:

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

公共类MyViewModel{。。。。。。

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

);

这里,有一个匿名方法,其中有那个“点击的按钮”。

这将捕获父ViewModel中的变量。

因此,您可以在viewmodel中设置一个公共属性,该属性绑定到视图中的text属性。

为了使视图做出响应,您需要实现inotifypropertychanged并在该公共属性的setter中引发property changed。

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

从上面。

如果PersonName绑定到视图中的textblock。

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

在该命令中,您可以执行以下操作:

 PersonName = "Andy";

它调用PersonName的setter,绑定到PersonName的textblock将读取新值。