WPF MVVM - Свойства привязки в UserControls к ViewModel контейнера - PullRequest
7 голосов
/ 09 декабря 2010

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

Я вставил два экземпляра UserControl в MainWindow:

<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. То есть только один из них показан в любое время.

Это работало нормально ... пока пользовательские элементы управления не получили свои собственные модели представления. Теперь среда выполнения пытается найти связанные VisibilityProperties (MyUserControl1Visibility…) в ViewModels UserControls вместо ViewModel в MainWindow.

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

Ответы [ 2 ]

11 голосов
/ 09 декабря 2010

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

<local:MyUserControl Visibility="{Binding ElementName=mainWindow, 
                                          Path=DataContext.MyUserControl1Visibility,
                                          Mode=OneWay,
                                          UpdateSourceTrigger=PropertyChanged}" />
0 голосов
/ 09 декабря 2010
Visibility="{Binding RelativeSource={x:Static RelativeSource.Self},
            Path=DataContext.MyUserControl1Visibility}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...