我有一个自定义控件(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));
但是,如果我在使用自定义控件的实例(例如在MainWindow中)时尝试设置VM:
<Grid>
<controls:NavigationContentCtrl
CurrentContentViewModel="{x:Type vm:SampleMainContentViewModel}"
/>
</Grid>
然后我得到的只是虚拟机的字符串名称:
非常感谢能提供帮助的人。
答案 0 :(得分:0)
感谢@Clemens提示我重新启动大脑。
在控件的实例化(例如在MainWindow中)中,控件的依赖项属性应绑定到属性:
<Grid>
<controls:NavigationContentCtrl
CurrentContentViewModel="{Binding ContentViewModel}"
/>
</Grid>
ContentViewModel属性在基础MainWindowViewModel中声明并设置:
public object ContentViewModel { get; set; } = new SampleMainContentViewModel();
此外,可以简化Dependency属性以删除BindsTwoWayByDefault语法,并可以使用更简单的TemplateBinding语法设置ContentPresenter的Content属性。