[英]DataTemplate in Custom Control
我有一个自定义控件(NavigationContentCtrl),用于显示各种View / ViewModel。
在自定义控件的参考资料中,给定ViewModel的数据模板指向相应的View(为简单起见,我仅包括一对VM / V):
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<DataTemplate DataType="{x:Type vm:SampleMainContentViewModel}">
<views:SampleMainContentView/>
</DataTemplate>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
还有一个绑定到基础Dependency属性的ContentPresenter:
<ContentPresenter Grid.Column="1"
Content="{Binding CurrentContentViewModel,
RelativeSource={RelativeSource TemplatedParent}}"/>
在支持Dependency属性(CurrentContentViewModel)中,如果我在该属性中实例化VM,则控件将找到相应的View并正确显示它。
例如,使用“ SampleMainContentViewModel”,可以很好地工作:
// Using a DependencyProperty as the backing store for CurrentContentViewModel. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CurrentContentViewModelProperty =
DependencyProperty.Register("CurrentContentViewModel", typeof(object),
typeof(NavigationContentCtrl),
new FrameworkPropertyMetadata(new SampleMainContentViewModel(),
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
但是,如果我在使用自定义控件的实例时尝试设置VM(例如在MainWindow中):
<Grid>
<controls:NavigationContentCtrl
CurrentContentViewModel="{x:Type vm:SampleMainContentViewModel}"
/>
</Grid>
然后,我得到的只是VM的字符串名称:
非常感谢任何可以提供帮助的人。
感谢@Clemens提示我重新启动大脑。
在控件的实例化中(例如在MainWindow中),控件的依赖项属性应绑定到属性:
<Grid>
<controls:NavigationContentCtrl
CurrentContentViewModel="{Binding ContentViewModel}"
/>
</Grid>
属性ContentViewModel在基础MainWindowViewModel中声明和设置:
public object ContentViewModel { get; set; } = new SampleMainContentViewModel();
此外,可以简化Dependency属性以删除BindsTwoWayByDefault语法,并且可以使用更简单的TemplateBinding语法设置ContentPresenter的Content属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.