2010-12-09 171 views
7

我有一個Window(MainWindow.xaml),它有一個ViewModel(MainWindowViewModel.cs)。我也有一個叫做MyUserControl.xaml的UserControl,它也有一個對應的ViewModel(MyUserControlViewModel.cs)。WPF MVVM - 在UserControls上綁定到容器ViewModel的屬性

我已插入該用戶控件的兩個實例到主窗口:

<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> 

在主窗口的代碼隱藏我設置窗口的DataContext到視圖模型的一個實例:

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"); 
     } 
    } 
} 

此外,主窗口和MainWindowViewModel有按鈕和命令,使用戶能夠在兩個實例的MyUserControl之間切換。也就是說,任何時候都只顯示其中的一個。

這工作得很好......直到UserControls有自己的ViewModels。現在,運行時嘗試在UserControl的ViewModels上找到綁定的VisibilityProperties(MyUserControl1Visibility ...),而不是MainWindow的ViewModel。

如何使這些綁定轉到MainWindowViewModel而不是UserControl實例的相應ViewModel?

回答

10

MyUserControls從MainWindow繼承了DataContext,這就是爲什麼它開始工作。當MyUserControl1獲得它自己的ViewModel時,它將成爲它的DataContext。也許這很清楚:)要在綁定中使用MainWindow的DataContext,您可以使用RelativeSource或命名該窗口並使用ElementName

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

謝謝Meleak! :) – haagel 2010-12-09 20:39:56

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