我想更改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
中。 问题是从命令角度来看,我无法同时访问DataContext
和ViewModel
。
任何命令的实现通常都在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将读取新值。