2

ContentPresenterテンプレートがバインドされたオブジェクトの一種のビューであるプロパティに基づいて、表示するテンプレートを選択するオブジェクトにバインドしようとしています。

ただし、以下に示すようにバインドを設定すると、プロパティの所有者ではなく、バインドされたプロパティDataContextが自分DataTemplateのものになります。どうすればこれを修正できますか?

ありがとう!

ベース オブジェクトは次のようになります (関連するプロパティ以外はすべて切り取っています)。

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>

s の仕組みに基づいてContentPresenter、例では期待どおりに動作しています。別の方法として、CurrentPage のコンテキストから親プロパティにアクセスできるように、モデル オブジェクトをナビゲート可能にする (CurrentPage オブジェクトがその親 ApplicationInterface への参照を持つようにする) こともできます。

于 2012-08-07T16:04:53.823 に答える