6

派生型のインスタンスによって設定される派生型ContentControlコントロール ( と呼びましょうMyContentControl)を構築しようとしています( と呼びましょう)。ControlTemplateDataTemplateSelectorMyTemplateSelector

私がこれをしようとすると:

ContentControl contentControl = new ContentControl();
contentControl.ContentTemplateSelector = new MyTemplateSelector();
contentControl.Content = "Some ContentControl Content";

MyContentControl myContentControl = new MyContentControl();    
myContentControl.ContentTemplateSelector = new MyTemplateSelector();
myContentControl.Content = "Some MyControl Content";

MyTemplateSelectorこれらのコントロールにコンテンツを設定すると、メソッドのオーバーライドがと DataTemplateSelector.SelectTemplate()の両方に対して呼び出されることを期待しています。contentControlmyContentControl

実際には、contentControl に対してのみ呼び出されます。それを機能させるには何をする必要がありますか (そしてその理由は!) myContentControl?

(関連性があるかどうかはわかりませんが、現時点では、のメタデータ情報をオーバーライドする以外MyContentControlには何もしません。DependencyPropertiesDefaultStyleKeyProperty

編集(コンテンツを他の投稿から元の質問に移動):

次に、もう少し詳細な例を示します。

  1. MyContentControl を作成します。

    public class MyContentControl : ContentControl
    {
      static MyContentControl()
      {
        DefaultStyleKeyProperty.OverrideMetadata(typeof (MyContentControl),
                                             new FrameworkPropertyMetadata(typeof (MyContentControl)));
      }
      public MyContentControl() {}
    }
    
  2. 作成MyTemplateSelector:

    public class MyTemplateSelector : DataTemplateSelector
    {
      public override DataTemplate SelectTemplate(object item, DependencyObject container)
      {
        return null;  // <== Place the breakpoint here
      }
    }
    
  3. メイン ウィンドウに追加ContentControlして制御します (例):MyContent

    <StackPanel>
        <local:MyContentControl x:Name="myContentControl" />
        <ContentControl x:Name="contentControl" />
    </StackPanel>
    
  4. InitializeComponentこのコードを後(またはLoadedハンドラー) のどこかに追加します。

    myContentControl.ContentTemplateSelector = new MyTemplateSelector();
    myContentControl.Content = "123";
    
    contentControl.ContentTemplateSelector = new MyTemplateSelector();
    contentControl.Content = "ABC";
    

手順 (2) で説明したブレークポイントはcontent="ABC"contentControl要素に対して 1 回だけヒットします。

4

3 に答える 3

2

同じ問題があり、DataTemplateSelector が ContentControl に適用されたが、派生 Control には適用されなかったという理由が、派生 Control の ControlTemplate に隠されていました。ContentTemplateSelector のテンプレート バインディングを追加するのを忘れただけです。

<ControlTemplate TargetType="{x:Type local:UniControl}">
<Border Background="{TemplateBinding Background}"
        BorderBrush="{TemplateBinding BorderBrush}"
        BorderThickness="{TemplateBinding BorderThickness}">
    <ContentPresenter Content="{TemplateBinding Content}"
                        ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}"/>
</Border>

お役に立てれば。

于 2011-09-30T14:32:05.617 に答える
2

私は以前に同じ問題を抱えていましたが、これで解決しました (変更について DataTemplateSelector に通知する) ヒント。

私の問題は、ComboBox の選択が変更されたときに埋め込まれた UserControl を変更する ContentPresenter が欲しいということでした。

Combobox+ContentPresenter XAML は

        <ComboBox Name="comboBoxControl" Grid.Row="1" Grid.Column="1" SelectionChanged="comboBox_SelectionChanged">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <cmd:EventToCommand Command="{Binding Path=ChangeControlCommand, Mode=OneWay}" CommandParameter="{Binding Path=SelectedItem.Content, ElementName=comboBoxControlType}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <ComboBoxItem>UserControl-1-</ComboBoxItem>
        <ComboBoxItem>UserControl-2-</ComboBoxItem>
    </ComboBox>
<ContentPresenter Name="contentPresenter" ContentTemplateSelector="{Binding Source={StaticResource controlCueTemplateSelector}}" 
                      Content="{Binding}" />

ご覧のとおり、MVVM 方式のコマンド バインディングが私のアプローチでした。コード ビハインドを記述したくない場合でも、以下のように適切なイベントを含むコード ビハインドを記述してください。

    private void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var content = contentPresenter.Content;
        contentPresenter.ClearValue(ContentPresenter.ContentProperty);
        contentPresenter.SetValue(ContentPresenter.ContentProperty, content);
    }

要するに、バインドされたターゲット オブジェクト (私の場合は Content プロパティ) をリセットする必要があります。

于 2010-08-16T07:20:50.610 に答える
0

簡単な例を作成しただけで問題なく動作したため、コードをさらに投稿する必要があるかもしれません。myDataTemplateのみが含まれTextBox、 my はDataTemplateSelector常にそれを返し、 aとから派生したクラスのDataTemplate両方がmy を使用します。どちらの場合も aが表示されました。ContentControlContentControlDataTemplateSelectorTextBox

于 2009-07-17T11:08:56.117 に答える