绑定ContentTemplateSelector的属性,但将DataContext传递给模板

时间:2012-08-07 16:00:16

标签: c# wpf data-binding

我正在尝试将ContentPresenter绑定到一个对象,该对象将根据某些属性选择要显示的模板,其中模板是绑定对象的一种视图。

但是,当我按如下所示设置绑定时,我最终将绑定属性作为DataContext的{​​{1}},而不是属性的所有者。我该如何解决这个问题?

谢谢!

基础对象看起来像这样(除了相关属性之外我已经删除了所有内容):

DataTemplate

然后我尝试在XAML中绑定到public class ApplicationInterface : BaseBusinessObject, IState, INotifyPropertyChanged { public Type CurrentPage { get { return (Type)_properties["CurrentPage"].Value; } set { _properties["CurrentPage"].Value = value; } } } 属性,如下所示:

CurrentPage

<ContentPresenter Content="{Binding CurrentPage}" ContentTemplateSelector={StaticResource ResourceKey=PageTemplateSelector}"/> 的实施:

DataTemplateSelector

最后是public class PageTemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { FrameworkElement element = container as FrameworkElement; if (element != null && item != null && item is Type) { Type t = item as Type; if (t == typeof(Home)) return element.FindResource("homeTemplate") as DataTemplate; else if (t == typeof(ProfileEdit)) return element.FindResource("profileTemplate") as DataTemplate; else if (t == typeof(WBI)) return element.FindResource("wbiTemplate") as DataTemplate; else if (t == typeof(PC)) return element.FindResource("pcTemplate") as DataTemplate; } return null; } } s:

DataTemplate

2 个答案:

答案 0 :(得分:1)

我最终命名了我的窗口,然后绑定到它的DataContext。所以基本上我所要做的就是将模板绑定更改为:

<DataTemplate x:Key="homeTemplate">
    <pages:Home DataContext="{Binding ElementName=mainWindow, Path=DataContext}"/>
</DataTemplate>

我选择了这个而不是改变我的业务对象,因为视图是一个纯粹的UI构造。

答案 1 :(得分:0)

编辑:根据评论,也许您可​​以尝试向DataTemplate中的页面添加属性(例如Parent),然后使用RelativeSource绑定传递DataContext。像这样:

<ContentPresenter Content="{Binding CurrentPage}" ContentTemplateSelector={StaticResource ResourceKey=PageTemplateSelector}" Tag="{Binding .}"/>

<DataTemplate x:Key="homeTemplate">
  <pages:Home DataContext="{Binding}" Parent="{Binding Path=Tag, RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}}"/>
</DataTemplate>

结束编辑

根据您在上面显示的内容,您应该能够将Content属性绑定到父对象:

<ContentPresenter Content="{Binding .}" ContentTemplateSelector={StaticResource ResourceKey=PageTemplateSelector}"/>

然后将DataTemplate数据绑定到CurrentPage属性:

<DataTemplate x:Key="homeTemplate">
    <pages:Home DataContext="{Binding CurrentPage}"/>
</DataTemplate>
<DataTemplate x:Key="profileTemplate">
    <pages:ProfileEdit DataContext="{Binding CurrentPage}"/>
</DataTemplate>
<DataTemplate x:Key="wbiTemplate">
    <pages:WBI DataContext="{Binding CurrentPage}"/>
</DataTemplate>
<DataTemplate x:Key="pcTemplate">
    <pages:PC DataContext="{Binding CurrentPage}"/>
</DataTemplate>

根据ContentPresenter的工作原理,它在您的示例中表现得如预期。另一种方法是使模型对象可导航(因此CurrentPage对象具有对其Parent ApplicationInterface的引用),以便您可以从CurrentPage的上下文访问父属性。