WPF MVVM - свойства привязки UserControls к ViewModel контейнера

у меня есть окно (MainWindow.xaml), который имеет ViewModel (MainWindowViewModel.цезий.) У меня также есть UserControl под названием MyUserControl.xaml, который также имеет соответствующую ViewModel (MyUserControlViewModel.цезий.)

я вставил два экземпляра 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>

В CodeBehind MainWindow я установил DataContext окна в экземпляр ViewModel:

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

MainWindowViewModel имеет Visibility-свойства, к которым привязаны экземпляры 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 не получили свои собственные ViewModels. Теперь среда выполнения пытается найти связанные VisibilityProperties (MyUserControl1Visibility...) на ViewModels из UserControls вместо ViewModel из MainWindow.

как сделать эти привязки перейти к MainWindowViewModel вместо соответствующих ViewModels экземпляров UserControl?

2 ответов


MyUserControls унаследовали DataContext от MainWindow, и именно поэтому он работает с самого начала. Когда MyUserControl1 получит собственную ViewModel, это будет его DataContext. Возможно, Вам было ясно:) чтобы использовать DataContext главного окна в привязке, вместо этого вы можете использовать RelativeSource или назвать окно и использовать ElementName

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

Visibility="{Binding RelativeSource={x:Static RelativeSource.Self},
            Path=DataContext.MyUserControl1Visibility}"