绑定ContentTemplateSelector属性,但将DataContext传递给模板 [英] Bind property for ContentTemplateSelector but pass DataContext to template
问题描述
我试图将一个 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 DataTemplate
s, 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 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>
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屋!