WPF MVVM - 在UserControls上绑定到容器ViewModel的属性
我有一个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?
MyUserControls从MainWindow继承了DataContext,这就是为什么它开始工作。当MyUserControl1获得它自己的ViewModel时,它将成为它的DataContext。也许这很清楚:)要在绑定中使用MainWindow的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}"
谢谢Meleak! :) – haagel 2010-12-09 20:39:56