我试图搜索,但找不到答案。我有一个包含两个用户控件 A 和 B 的主窗口。它们都有单独的 ViewModel,但从同一个模型实例中获取数据。当我更改用户控件 A 中的属性时,我希望它更新用户控件 B 中的相应值。
似乎OnPropertyChanged("MyProperty")
只有在同一个 ViewModel 中更新属性。我知道 ViewModel B 背后的数据与 ViewModel A 相同,因为我可以使用刷新按钮手动刷新数据。
是否有任何简单的方法来刷新其他用户控件中的值?
我试图搜索,但找不到答案。我有一个包含两个用户控件 A 和 B 的主窗口。它们都有单独的 ViewModel,但从同一个模型实例中获取数据。当我更改用户控件 A 中的属性时,我希望它更新用户控件 B 中的相应值。
似乎OnPropertyChanged("MyProperty")
只有在同一个 ViewModel 中更新属性。我知道 ViewModel B 背后的数据与 ViewModel A 相同,因为我可以使用刷新按钮手动刷新数据。
是否有任何简单的方法来刷新其他用户控件中的值?
如果您需要这种行为,模型也必须实现INotifyPropertyChanged
接口。
class Model : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string someText = string.Empty;
public string SomeText
{
get { return this.someText; }
set { this.someText = value; this.PropertyChanged(this, new PropertyChangedEventArgs("SomeText")); }
}
}
class ViewModelA : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private Model data;
public Model Data
{
get { return this.data; }
set { this.data = value; this.PropertyChanged(this, new PropertyChangedEventArgs("Data")); }
}
}
class ViewModelB : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private Model data;
public Model Data
{
get { return this.data; }
set { this.data = value; this.PropertyChanged(this, new PropertyChangedEventArgs("Data")); }
}
}
您必须将相同的模型实例传递给两个视图模型,然后像这样在控件中绑定数据。
对于使用 ViewModelA 作为 DataContext 的 TextBoxA
<TextBox x:Name="TextBoxA" Text="{Binding Path=Data.SomeText}" />
对于使用 ViewModelB 作为 DataContext 的 TextBoxB
<TextBox x:Name="TexTBoxB" Text="{Binding Path=Data.SomeText}" />
现在,当您更改其中一个文本框中的文本时,它会自动更改另一个文本框中的文本。