1

データトリガーを使用してビューモデル内のブールプロパティに応じてContentTemplateが動的に変更されるContentControlを含むビューがあります。

        <ContentControl>

            <!-- MyFirstControl user control by default-->
            <local:MyFirstControl/>

            <ContentControl.Style>
                <Style TargetType="ContentControl">                        
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsSelected}"
                                     Value="True">
                            <Setter Property="ContentTemplate">
                                <Setter.Value>
                                    <DataTemplate>
                                        <!-- Different user control when trigger fired-->
                                        <local:MySecondControl />
                                    </DataTemplate>
                                </Setter.Value>
                            </Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ContentControl.Style>

        </ContentControl>

トリガーが起動されたときに表示されるMySecondControlユーザーコントロールは、テキストブロックを表示することを目的としています。テキストブロックのTextプロパティは、同じビューモデル内のプロパティにもバインドされます。

私は明らかに間違っていますが、トリガーされたコントロールは同じデータコンテキストを継承すると考えていました。代わりに、MyFirstControlユーザーコントロールをデータコンテキストとして使用しようとしています(このエラーも受け取ります:System.Windows.Dataエラー:40:BindingExpressionパスエラー:)。

トリガーされたコントロールのデータコンテキストを次のように明示的に記述しようとしました。

<local:MySecondControl DataContext="{Binding}"/>

ただし、データコンテキストとしてデフォルトのコントロール(MyFirstControl)を使用しています。

私の質問は、トリガーされたコントロールが、それが含まれているビューファイルと同じデータコンテキストを使用するように強制するにはどうすればよいですか?

私はWPFシーンにかなり慣れていないので、これが理にかなっていることを願っています。

前もって感謝します。

4

2 に答える 2

1

との間には違いがContentありContentTemplateます。

Contentコントロールの実際のコンテンツであり、ContentTemplate描画方法を定義しますContent

Contentプロパティをに設定していますMyFirstControl。トリガーはContentTemplateプロパティを変更しているため、コンテンツ(MyFirstControl)の描画方法が変更されているため、を使用して描画されますMySecondControlが、Contentそれ自体は変更されていないため、DataContextは引き続き使用されますMyFirstControl

実際のプロパティではなく、デフォルトContentTemplateをに設定することをお勧めします。MyFirstControlContent

<ContentControl>

    <ContentControl.Style>
        <Style TargetType="ContentControl">  
            <!-- Set default ContentTemplate -->
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <local:MyFirstControl />
                    </DataTemplate>
                </Setter.Value>
            </Setter>

            <Style.Triggers>
                <DataTrigger Binding="{Binding IsSelected}"
                             Value="True">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <!-- Different user control when trigger fired-->
                                <local:MySecondControl />
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>

</ContentControl>
于 2012-10-19T16:40:39.633 に答える
0

これがお役に立てば幸いです。

<local:MySecondControl DataContext="{Binding Path=DataContext, 
                  RelativeSource={RelativeSource TemplatedParent}}"/>
于 2012-10-19T16:41:55.227 に答える