2010-12-09 9 views
7

J'ai une fenêtre (MainWindow.xaml) qui a un ViewModel (MainWindowViewModel.cs). J'ai également un UserControl appelé MyUserControl.xaml qui a également un ViewModel correspondant (MyUserControlViewModel.cs).WPF MVVM - Propriétés de liaison sur UserControls à ViewModel du conteneur

J'ai inséré deux instances du UserControl dans le 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> 

Dans le CodeBehind de MainWindow je mis le DataContext de la fenêtre à une instance du ViewModel:

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

MainWindowViewModel a les propriétés Visibility que les instances MyUserControl sont liées. Ils ont tous deux ressembler à ceci:

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

De plus, MainWindow et MainWindowViewModel a des boutons et des commandes pour permettre à l'utilisateur de basculer entre les deux instances de myUserControl. C'est-à-dire qu'un seul d'entre eux est montré à n'importe quel moment.

Cela a bien fonctionné ... jusqu'à ce que les UserControls aient leur propre ViewModels. Maintenant, le moteur d'exécution essaie de trouver le VisibilityProperties lié (MyUserControl1Visibility ...) sur les ViewModels des UserControls au lieu du ViewModel de MainWindow. Comment puis-je faire ces liaisons aller à MainWindowViewModel au lieu de ViewModels respectif des instances UserControl?

Répondre

10

Les MyUserControls ont hérité le DataContext de MainWindow et c'est la raison pour laquelle cela fonctionne au début. Lorsque MyUserControl1 obtient un ViewModel qui sera son DataContext. Peut-être cela était clair pour vous :) Pour utiliser le DataContext du MainWindow dans la liaison à la place, vous pouvez utiliser RelativeSource ou le nom de la fenêtre et utiliser ElementName

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

Merci Meleak! :) – haagel

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