【问题标题】:WPF MVVM - Binding properties on UserControls to ViewModel of containerWPF MVVM - 将 UserControls 上的属性绑定到容器的 ViewModel
【发布时间】:2010-12-09 19:12:02
【问题描述】:

我有一个窗口 (MainWindow.xaml),它有一个 ViewModel (MainWindowViewModel.cs)。我还有一个名为 MyUserControl.xaml 的 UserControl,它也有一个相应的 ViewModel (MyUserControlViewModel.cs)。

我在主窗口中插入了两个 UserControl 实例:

<Window x:Class="MyProject.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyProject"
    Title="My Window">
    <Grid>
        <local:MyUserControl Visibility="{Binding Path=MyUserControl1Visibility, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
        <local:MyUserControl Visibility="{Binding Path=MyUserControl2Visibility, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
    </Grid>
</Window>

在 MainWindow 的 CodeBehind 中,我将 Window 的 DataContext 设置为 ViewModel 的一个实例:

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

MainWindowViewModel 具有 MyUserControl 实例绑定到的可见性属性。它们看起来都是这样的:

private Visibility _myUserControl1Visibility = Visibility.Collapsed;
public Visibility MyUserControl1Visibility
{
    get
    {
        return _myUserControl1Visibility;
    }
    private set
    {
        if (value != _myUserControl1Visibility)
        {
            _myUserControl1Visibility = value;
            OnPropertyChanged("MyUserControl1Visibility");
        }
    }
}

此外,MainWindow 和 MainWindowViewModel 具有使用户能够在两个 MyUserControl 实例之间切换的按钮和命令。也就是说,任何时候都只显示其中一个。

这工作得很好……直到 UserControls 有了自己的 ViewModel。现在运行时尝试在 UserControls 的 ViewModel 上而不是 MainWindow 的 ViewModel 上找到绑定的 VisibilityProperties (MyUserControl1Visibility...)。

如何使这些绑定转到 MainWindowViewModel 而不是 UserControl 实例的相应 ViewModel?

【问题讨论】:

    标签: wpf mvvm binding


    【解决方案1】:

    MyUserControls 从 MainWindow 继承了 DataContext,这就是它开始工作的原因。当 MyUserControl1 获得它自己的 ViewModel 时,它将成为它的 DataContext。也许这对您来说很清楚:) 要在绑定中使用 MainWindow 的 DataContext,您可以使用 RelativeSource 或命名 Window 并使用 ElementName

    <local:MyUserControl Visibility="{Binding ElementName=mainWindow, 
                                              Path=DataContext.MyUserControl1Visibility,
                                              Mode=OneWay,
                                              UpdateSourceTrigger=PropertyChanged}" />
    

    【讨论】:

      【解决方案2】:
      Visibility="{Binding RelativeSource={x:Static RelativeSource.Self},
                  Path=DataContext.MyUserControl1Visibility}"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-26
        • 2019-02-28
        • 1970-01-01
        • 1970-01-01
        • 2011-02-01
        • 2010-12-20
        • 2020-12-29
        • 1970-01-01
        相关资源
        最近更新 更多