我是WPF中使用MVVM的初学者,发现似乎无法更改文本框或标签的值。这是一个例子。
在Xaml中:
Name的原始值是“Peter”。
但是在我按下一个在ViewModel中调用命令的按钮并将Name的值更改为 “约翰”。因此,假设文本框的值也将更改为John。但是,它没有改变。
我在网上找到了很多例子,发现它们都没有实现这种功能。我从他们那里学到的是使用ListView的Command和ItemsSource。 当我使用button来引发命令来更改视图的ItemsSource时,ListView的值将会改变。当Binding to ItemsSource发生更改时,其值将自动更改。
但是,即使更改了它们的绑定值,我也无法使TextBox或Label的值发生变化。
实际上,我在MVVM中还很年轻。我想我还有很多,我不知道。 你能举个例子说明按钮点击后如何更改文本框吗?顺便说一句,我不太确定如何为按钮命令。它似乎涉及我在网上的样本中找到的那么多代码。有简单的方法吗?
非常感谢。
答案 0 :(得分:3)
您的ViewModel需要实现INotifyPropertyChanged
。
文档见here
public class Bar : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string foo;
public string Foo
{
get { return this.foo; }
set
{
if(value==this.foo)
return;
this.foo = value;
this.OnPropertyChanged("Foo");
}
}
private void OnPropertyChanged(string propertyName)
{
if(this.PropertyChanged!=null)
this.PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
}
}
答案 1 :(得分:1)
您的视图模型应该实现INotifyPropertyChanged,以便WPF知道您已更改了属性的值。
以下是
的示例// This is a simple customer class that
// implements the IPropertyChange interface.
public class DemoCustomer : INotifyPropertyChanged
{
// These fields hold the values for the public properties.
private string customerNameValue = String.Empty;
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
var listeners = PropertyChanged;
if (listeners != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public string CustomerName
{
get
{
return this.customerNameValue;
}
set
{
if (value != this.customerNameValue)
{
this.customerNameValue = value;
NotifyPropertyChanged("CustomerName");
}
}
}
}