2

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

但是,当我如下所示设置绑定时,我最终将绑定属性作为DataContextDataTemplate的 s,而不是属性的所有者。我怎样才能解决这个问题?

谢谢!

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

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

然后我尝试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 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;
    }
}

最后是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>
4

2 回答 2

1

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

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

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

于 2012-08-07T17:36:47.640 回答
0

编辑:根据评论,也许您可​​以尝试将属性添加到 DataTemplate 中的页面(例如父级),然后使用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>

根据ContentPresenters 的工作方式,它的行为符合您的示例中的预期。另一种方法是使您的模型对象可导航(因此 CurrentPage 对象具有对其父应用程序接口的引用),以便您可以从 CurrentPage 的上下文访问父属性。

于 2012-08-07T16:04:53.823 回答