使用绑定更新多个用户控件

时间:2012-12-17 15:33:10

标签: c# wpf mvvm binding user-controls

我试过搜索,但我找不到答案。我有一个包含两个用户控件A和B的主窗口。它们都有单独的ViewModel,但是从同一个modelinstance获取它们的数据。当我在usercontrol A中更改属性时,我希望它更新usercontrol B中的相应值。

似乎OnPropertyChanged("MyProperty")仅更新同一ViewModel中的属性。我知道ViewModel B背后的数据与ViewModel A的数据相同,因为我可以使用刷新按钮手动刷新数据。

有没有简单的方法来刷新其他用户控件中的值?

1 个答案:

答案 0 :(得分:0)

如果您需要此类行为,模型还必须实现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}" />

现在,当您更改其中一个文本框中的文本时,它将自动在另一个文本框中更改。