【发布时间】:2020-06-20 11:50:58
【问题描述】:
我想更改ViewModel 属性的值(与DataContext 绑定)。使用经典事件非常容易,使用命令它成为艰巨的任务。这是我的代码:
公共部分类 MainWindow : Window
{
ViewModel _vm = new ViewModel();
公共主窗口()
{
初始化组件();
_vm.BtnClick = new BtnClick();
数据上下文 = _vm;
}
}
公共类 BtnClick : ICommand
{
公共事件 EventHandler CanExecuteChanged
{
添加 { CommandManager.RequerySuggested += 值; }
删除 { CommandManager.RequerySuggested -= 值; }
}
public bool CanExecute(对象参数)
{
返回真;
}
公共无效执行(对象参数)
{
Debug.WriteLine(parameter.ToString());
}
}
公共类视图模型
{
公共 ICommand BtnClick { 获取;放; }
公共字符串输入{获取;放; }
公共字符串输出{获取;放; }
}
<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。
【问题讨论】:
-
是什么让您认为您需要访问 DataContext?您要解决的问题是什么? Command 实例实际上应该在您的 ViewModel 中定义,而不是在 View 中。
-
为了更改
TextBlockText,我必须访问ViewModel。没有其他办法。 -
MVVM 的全部意义在于您通过 ViewModel 属性进行所有更新,并且相应的 UI 控件将通过数据绑定进行更新。不过,这确实需要您的 ViewModel 实现
INotifyPropertyChanged。