绑定ContentTemplateSelector属性,但将DataContext传递给模板 [英] Bind property for ContentTemplateSelector but pass DataContext to template

查看:552
本文介绍了绑定ContentTemplateSelector属性,但将DataContext传递给模板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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



谢谢!



基础对象看起来像这样(我已经剪掉了除了相关的属性之外):

  public class ApplicationInterface:BaseBusinessObject,
IState,INotifyPropertyChanged
{
public Type CurrentPage
{
get
{
return(Type)_properties [CurrentPage]。
}
set
{
_properties [CurrentPage]。
}
}
}

然后我试图绑定到 CurrentPage 属性在XAML喜欢这样:

 < 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是Type)
{
键入t =项作为类型;
if(t == typeof(Home))
返回element.FindResource(homeTemplate)作为DataTemplate;
else if(t == typeof(Profi leEdit))
返回element.FindResource(profileTemplate)作为DataTemplate;
else if(t == typeof(WBI))
返回element.FindResource(wbiTemplate)作为DataTemplate;
else if(t == typeof(PC))
返回element.FindResource(pcTemplate)作为DataTemplate;
}
返回null;
}
}

最后, DataTemplate s:

 < 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>


解决方案

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

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

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

I am trying to bind a ContentPresenter to an object which will select a template to display based on some property where the template is a sort of view on the bound object.

However, when I set up the binding as seen below, I wind up with the bound property as the DataContext of my DataTemplates, not the owner of the property. How can I fix this?

Thanks!

The base object looks like this (I've cut out all but the relevant property):

public class ApplicationInterface : BaseBusinessObject, 
    IState, INotifyPropertyChanged
{
    public Type CurrentPage
    {
        get
        {
            return (Type)_properties["CurrentPage"].Value;
        }
        set
        {
            _properties["CurrentPage"].Value = value;
        }
    }
}

I then am trying to bind to CurrentPage property in XAML like so:

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

The implementation of the 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;
    }
}

And finally the DataTemplates:

    <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>

解决方案

I ended up naming my window, then binding to the DataContext of it. So basically all I had to do was change the template bindings to:

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

I opted for this rather than alter my business objects since the view is a purely UI construct.

这篇关于绑定ContentTemplateSelector属性,但将DataContext传递给模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆