2009-07-17 37 views
5

我試圖建立一個ContentControl派生的控件(我們稱之爲MyContentControl),將有其ControlTemplateDataTemplateSelector派生類型的實例集(姑且稱之爲它MyTemplateSelector)。WPF DataTemplateSelector.SelectTemplate不是呼籲ContentControl中衍生型

當我嘗試這樣的:

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"; 

我想到的是,當我在這些控件設置內容,MyTemplateSelectorDataTemplateSelector.SelectTemplate()方法的覆蓋被調用兩個contentControlmyContentControl

實際上,它僅被稱爲contentControl。我需要做些什麼(以及爲什麼!)以使其適用於myContentControl

(不知道這是否有關,但目前MyContentControl不超過重寫的元數據信息DefaultStyleKeyPropertyDependencyProperties其他做什麼

編輯(移動從其他崗位原題內容):

這裏是一個比較詳盡的例子:

  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. 添加ContentControlMyContent控制到主窗口(例如):

    <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元件。

回答

0

您可能需要發佈更多代碼,因爲我剛剛創建了一個簡單的示例,並且它工作正常。我的DataTemplate僅包含TextBox,我的DataTemplateSelector總是返回DataTemplate,並且ContentControlContentControl的派生類都使用我的DataTemplateSelector。在這兩種情況下都顯示一個TextBox

2

我得到了同樣的問題之前,我解決這個(Notify DataTemplateSelector about the change)提示。

我的問題是,我想要一個ContentPresenter,當ComboBox選擇改變時,它改變嵌入的UserControl。

組合框+ 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方式結合是我的方法。雖然您可能不想編寫代碼隱藏,但請使用適當的事件編寫代碼隱藏,如下所示。底線是,你需要重置綁定目標對象(在我的情況下,內容屬性)。

2

我剛剛有同樣的問題,並且DataTemplateSelector已被應用於ContentControl但不適用於我的派生控件的原因隱藏在我的派生控件的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> 

希望這有助於。

+0

謝謝。這爲我節省了一些硬幣。 – dotNET 2016-09-02 13:21:29