首先,将Chimera 设为Dependency Property,以便它可以参与绑定系统
public static readonly DependencyProperty ChimeraProperty =
DependencyProperty.Register("Chimera ", typeof(ChimeraViewModel),
typeof(ChimeraUserControl), new FrameworkPropertyMetadata(null));
public ChimeraViewModel Chimera
{
get { return (ChimeraViewModel)GetValue(ChimeraProperty ); }
set { SetValue(ChimeraProperty, value); }
}
其次,您可以通过RelativeSource 或ElementName 绑定来引用您的Chimeria 属性
<UserControl x:Name="ChimeraViewRoot" ... >
<StackPanel>
<!-- ElementName Binding -->
<TextBlock Text="{Binding ElementName=ChimeraViewRoot, Path=Chimeria.Name}" />
<!-- RelativeSource Binding -->
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ChimeraView}}, Path=Chimeria.Name}" />
</StackPanel>
</UserControl>
您也可以将UserControl 中控件的DataContext 设置为Chimera 属性,以使您的绑定语法更简洁
<UserControl x:Name="ChimeraViewRoot" ... >
<StackPanel DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ChimeraView}}, Path=Chimeria}" >
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Description}" />
</StackPanel>
</UserControl>
我通常不建议在UserControl 中定义UserControl.DataContext,因为该值应该从使用UserControl 的任何地方传入。当您试图弄清楚为什么特定的 UserControl 不能与预期的 DataContext 一起工作时,在 UserControl 中设置可能会导致混淆。
就我个人而言,当我创建一个应该与特定UserControl 一起使用的ViewModel 时,我更喜欢在应用程序中设置一个DataTemplate,以便我的ViewModel 的所有实例都使用我的自定义@987654342 绘制@。这意味着我假设 UserControl.DataContext 将始终是特定的 ViewModel 类型
<DataTemplate DataType="{x:Type local:ChimeriaViewModel}">
<local:ChimeriaView /> <!-- DataContext will always be ChimeriaViewModel -->
</DataTemplate>
每当可视树遇到ChimeriaViewMmodel 类型的对象时,这将隐式使用ChimeriaView。
例如,下面将渲染一个填充有ChimeriaView对象的StackPanel
<ItemsControl ItemsSource="{Binding MyListOfChimeriaViewModels}" />
或者为了显示单个对象,我通常会使用 ContentControl 之类的东西
<!-- Will get drawn using ChimeriaView due to DataTemplate defined above -->
<ContentControl Content="{Binding MyChimeriaViewModelProperty}" />
另外,通过知道ChimeriaView 的DataContext 将成为ChimeriaViewModel 类型的对象,我将完全摆脱DependencyProperty
<UserControl>
<StackPanel>
<!-- I know the DataContext is ChimeriaViewModel -->
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Description}" />
</StackPanel>
</UserControl>