如何设置ControlTemplate的DataContext?

时间:2013-06-18 17:59:51

标签: wpf data-binding telerik datatemplate controltemplate

我在Tile控件中设置ControlTemplate(在Telerik TileList中)。它看起来像这样:

<ControlTemplate TargetType="{x:Type telerik:Tile}">
    <Border>

        <!-- Some Content that binds to DP on the view models -->

            <ContentPresenter Content="{Binding}" />

    </Border>
</ControlTemplate>

其他地方:

<telerik:RadTileList ItemsSource="{Binding ComponentViewModels}">

我已经为将在Tile的ContentPresenter中呈现的项目定义了DataTemplates。我遇到的麻烦是,当一个ComponentViewModel被添加到ItemsSource(ComponentViewModel ObservableCollection)的目标时,会出现一个新的Tile,但它的DataContext是RadTileList的ViewModel,而不是单个组件的ViewModel。

我是否遗漏了有关在ControlTemplate中设置DataContext的内容?

2 个答案:

答案 0 :(得分:0)

这似乎是这样做的。我需要为ContentTemplate和Content属性执行TemplateBinding。

<ControlTemplate TargetType="{x:Type telerik:Tile}">
    <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}"/>

</ControlTemplate>

答案 1 :(得分:0)

要绑定到Presenter上的属性或附加到父视图或DataConmplate内部控件上的DataContext的ViewModel,您必须使用值为“FindAncestor”的RelativeSource属性和带有DataContext的控件类型正在寻找。

我见过的最常见的错误是,人们忘记为AcestorType属性使用{x:Type yourControlType}标记扩展,而是使用“AncestorType = yourControlType”。

以下是一个例子:

Width="{Binding DataContext.SomeProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"

其中“SomeProperty”是Pretronter或ViewModel上属于INotifyPropertyChanged模式的属性。

Width是ControlTemplate

中控件的属性