4

我在 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 的内容?

4

2 回答 2

1

要从 DataTemplate 中绑定到附加到父视图或控件上的 DataContext 的 Presenter 或 ViewModel 上的属性,您必须使用具有值“FindAncestor”的 RelativeSource 属性以及带有您正在寻找的 DataContext 的控件类型.

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

这是一个例子:

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

其中“SomeProperty”是 Presenter 或 ViewModel 上遵循 INotifyPropertyChanged 模式的属性。

宽度是ControlTemplate里面的控件的属性

于 2017-02-09T09:03:03.033 回答
0

这似乎做到了。我需要为 ContentTemplate 和 Content 属性做 TemplateBinding。

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

</ControlTemplate>
于 2013-06-20T13:15:49.193 回答