自定义控件中的DataTemplate

时间:2018-08-02 15:52:05

标签: c# wpf datatemplate

我有一个自定义控件(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>

然后我得到的只是虚拟机的字符串名称:

enter image description here

非常感谢能提供帮助的人。

1 个答案:

答案 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属性。