Binding 属性 for ContentTemplateSelector,但将 DataContext 传递给模板
本文关键字:DataContext 但将 属性 for ContentTemplateSelector Binding | 更新日期: 2024-11-06 10:49:53
我正在尝试将ContentPresenter
绑定到一个对象,该对象将根据某些属性选择要显示的模板,其中模板是绑定对象上的一种视图。
但是,当我设置如下所示的绑定时,我最终将绑定属性作为我DataTemplate
的DataContext
,而不是属性的所有者。我该如何解决这个问题?
谢谢!
基本对象如下所示(我已经删除了除相关属性之外的所有属性):
public class ApplicationInterface : BaseBusinessObject,
IState, INotifyPropertyChanged
{
public Type CurrentPage
{
get
{
return (Type)_properties["CurrentPage"].Value;
}
set
{
_properties["CurrentPage"].Value = value;
}
}
}
然后,我尝试绑定到 XAML 中的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;
}
}
最后是DataTemplate
<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 构造。
编辑:根据注释,也许您可以尝试向 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}"/>
然后将数据模板数据绑定到 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 对象具有对其父应用程序接口的引用),以便您可以从当前页的上下文访问父属性。