我在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的内容?
答案 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
中控件的属性