首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定ContentTemplateSelector的属性,但将DataContext传递给模板

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

Stack Overflow用户
提问于 2012-08-08 00:00:16
回答 2查看 4.4K关注 0票数 2

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

但是,当我如下所示设置绑定时,我将绑定属性作为我的DataTemplateDataContext,而不是该属性的所有者。我该如何解决这个问题呢?

谢谢!

基础对象看起来像这样(除了相关属性,我已经去掉了所有的属性):

代码语言:javascript
复制
public class ApplicationInterface : BaseBusinessObject, 
    IState, INotifyPropertyChanged
{
    public Type CurrentPage
    {
        get
        {
            return (Type)_properties["CurrentPage"].Value;
        }
        set
        {
            _properties["CurrentPage"].Value = value;
        }
    }
}

然后,我尝试绑定到XAML中的CurrentPage属性,如下所示:

代码语言:javascript
复制
<ContentPresenter Content="{Binding CurrentPage}" 
    ContentTemplateSelector={StaticResource ResourceKey=PageTemplateSelector}"/>

DataTemplateSelector的实现

代码语言:javascript
复制
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;
    }
}

最后是DataTemplate

代码语言:javascript
复制
    <DataTemplate x:Key="homeTemplate">
        <pages:Home DataContext="{Binding}"/>
    </DataTemplate>
    <DataTemplate x:Key="profileTemplate">
        <pages:ProfileEdit DataContext="{Binding}"/>
    </DataTemplate>
    <DataTemplate x:Key="wbiTemplate">
        <pages:WBI DataContext="{Binding}"/>
    </DataTemplate>
    <DataTemplate x:Key="pcTemplate">
        <pages:PC DataContext="{Binding}"/>
    </DataTemplate>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-08 01:36:48

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

代码语言:javascript
复制
<DataTemplate x:Key="homeTemplate">
    <pages:Home DataContext="{Binding ElementName=mainWindow, Path=DataContext}"/>
</DataTemplate>

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

票数 1
EN

Stack Overflow用户

发布于 2012-08-08 00:04:54

编辑:基于注释,也许您可以尝试向DataTemplate中的页面添加一个属性(例如Parent),然后使用RelativeSource绑定传递DataContext。如下所示:

代码语言:javascript
复制
<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属性绑定到父对象:

代码语言:javascript
复制
<ContentPresenter Content="{Binding .}" ContentTemplateSelector={StaticResource ResourceKey=PageTemplateSelector}"/>

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

代码语言:javascript
复制
<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对象就有一个对其父ApplicationInterface的引用),这样您就可以从CurrentPage的上下文中访问Parent属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11849786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档