我在尝试使一个简单的事情工作时遇到了一个令人惊讶的困难,即在一个命令绑定到Button的方法中设置一个属性。
当我在ViewModel构造函数中设置属性时,View中正确显示了正确的值,但是当我使用命令的方法设置此属性时,View不会更新,尽管我创建了任何断点(甚至在我RaisePropertyChanged
中的ViewModelBase
。我正在使用在线教程中轻松找到的香草RelayCommand
(如果我没弄错的话,可以从Josh Smith那里找到)。
我的项目可以下载here(Dropbox);
下面是一些重要的代码块:
视图模型:
public class IdiomaViewModel : ViewModelBase
{
public String Idioma {
get { return _idioma; }
set {
_idioma = value;
RaisePropertyChanged(() => Idioma);
}
}
String _idioma;
public IdiomaViewModel() {
Idioma = "nenhum";
}
public void Portugues () {
Idioma = "portu";
}
private bool PodePortugues()
{
if (true) // <-- incluir teste aqui!!!
return true;
return false;
}
RelayCommand _comando_portugues;
public ICommand ComandoPortugues {
get {
if (_comando_portugues == null) {
_comando_portugues = new RelayCommand(param => Portugues(),
param => PodePortugues());
}
return _comando_portugues;
}
}
public void Ingles () {
Idioma = "ingle";
}
private bool PodeIngles()
{
if (true) // <-- incluir teste aqui!!!
return true;
return false;
}
RelayCommand _comando_ingles;
public ICommand ComandoIngles {
get {
if (_comando_ingles == null) {
_comando_ingles = new RelayCommand(param => Ingles(),
param => PodeIngles());
}
return _comando_ingles;
}
}
}
查看后面没有额外的代码:
<Window x:Class="TemQueFuncionar.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:app="clr-namespace:TemQueFuncionar"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<app:IdiomaViewModel/>
</Window.DataContext>
<StackPanel>
<Button Content="Ingles" Command="{Binding ComandoIngles, Mode=OneWay}"/>
<Button Content="Portugues" Command="{Binding ComandoPortugues, Mode=OneWay}"/>
<Label Content="{Binding Idioma}"/>
</StackPanel>
</Window>
答案 0 :(得分:1)
Youdid填充接口实现,你没有提到它到基本视图模型。
您缺少此: INotifyPropertyChanged
链接到基类的接口,这使得视图刷新内容。
答案 1 :(得分:1)
你错过了ViewModelBase语句:ViewModelBase上的INotifyPropertyChanged