从另一个视图mvvm刷新用户控件视图/数据绑定

本文关键字:视图 控件 用户 数据绑定 刷新 另一个 mvvm | 更新日期: 2023-09-27 17:50:43

我有两个用户控件,以MVVM模式表示两个视图。第二个控件的视图模型声明为第一个用户控件的视图模型的childViewModel。

我想更新第二个控件视图的绑定,并在第一个控件接收到它的数据时刷新/更新。

如果用户控件是一个单独的窗口(通过创建一个新实例并传递新的数据绑定值并使用ShowDialog()),我能够做到这一点,但是当我将它们想象为单个窗口中的两个控件时,我需要能够刷新/更新第二个视图。

如何更新第二个视图?

从另一个视图mvvm刷新用户控件视图/数据绑定

这可以帮助你:

public class VM1 : DependencyObject
{
    public VM1()
    {
        //as you see the Child is instantiated when VM1 is instantiated
        Child = new VM2();
    }
    public VM2 Child
    {
        get { return (VM2)GetValue(ChildVmProperty); }
        set { SetValue(ChildVmProperty, value); }
    }
    public static readonly DependencyProperty ChildVmProperty =
        DependencyProperty.Register("Child", typeof(VM2), typeof(VM1), new UIPropertyMetadata(null));
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(string), typeof(VM1), new UIPropertyMetadata(null));
}
public class VM2 : DependencyObject
{
    public string InnerText
    {
        get { return (string)GetValue(InnerTextProperty); }
        set { SetValue(InnerTextProperty, value); }
    }
    public static readonly DependencyProperty InnerTextProperty =
        DependencyProperty.Register("InnerText", typeof(string), typeof(VM2), new UIPropertyMetadata(null));
}

在window.xaml:

<DockPanel>
    <my:Control1 DataContext="{Binding}"/>
    <my:Control2 DataContext="{Binding Child}"/>
</DockPanel>

但要确保在window.xaml.cs中正确设置了DataContext:

public MainWindow()
{
    InitializeComponent();
    this.DataContext = new VM1();
}

现在在每个控件绑定到属性名:

Control1.xaml:

<Grid>
    <TextBox Text="{Binding Text}"/>
</Grid>

Control2.xaml:

<Grid>
    <TextBox Text="{Binding InnerText}"/>
</Grid>