2009-07-17 16 views
5

मैं एक ContentControl व्युत्पन्न नियंत्रण का निर्माण करने की कोशिश कर रहा हूँ के लिए नहीं बुलाया (यह MyContentControl कॉल) ने अपने ControlTemplate एक DataTemplateSelector व्युत्पन्न प्रकार का एक उदाहरण द्वारा निर्धारित होगा कि (के जाने कॉल यह 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() विधि की है ओवरराइड contentControl और myContentControl देने की मांग हो जाता है।

असल में, इसे केवल सामग्री नियंत्रण के लिए बुलाया जाता है। मुझे myContentControl के लिए भी काम करने के लिए क्या करना है (और क्यों!)?

(सुनिश्चित नहीं हैं अगर यह प्रासंगिक है, लेकिन पल के लिए MyContentControlDefaultStyleKeyProperty के लिए मेटाडाटा जानकारी अधिभावी से DependencyProperties दूसरे के साथ कुछ नहीं करता

संपादित (मूल प्रश्न के अन्य पद से सामग्री) ले जाया गया।

यहाँ थोड़ा अधिक सविस्तार उदाहरण है:

  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 तत्व के लिए केवल एक बार मारा जाता है,।

उत्तर

0

आपको अपना अधिक कोड पोस्ट करने की आवश्यकता हो सकती है, क्योंकि मैंने अभी एक साधारण उदाहरण बनाया है और यह ठीक काम करता है। मेरे DataTemplate केवल एक TextBox होता है, मेरी DataTemplateSelector हमेशा रिटर्न कि DataTemplate, और दोनों एक ContentControl और एक वर्ग ContentControl से ली गई मेरी DataTemplateSelector का उपयोग करें। दोनों मामलों में TextBox प्रदर्शित किया गया था।

2

मैंने पहले एक ही समस्या है, और मैं इस (Notify DataTemplateSelector about the change) संकेत के साथ इसे हल।

मेरे समस्या थी, मैं एक ContentPresenter जो UserControl एम्बेडेड बदल जाता है जब ComboBox चयन बदल चाहते हैं।

Combobox + ContentPresenter XAML आप देख सकते हैं, आदेश MVVM तरीके से बाध्यकारी मेरे दृष्टिकोण था

 <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}" /> 

है। यद्यपि आप कोड-बैक लिखना नहीं चाहते हैं, कृपया नीचे दिए गए उचित ईवेंट के साथ कोड-बैक लिखें।

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

मुनाफा है, तो आप आबद्ध लक्ष्य वस्तु पुनर्स्थापित करने के लिए (मेरे मामले, सामग्री संपत्ति में) की जरूरत है।

2

मैं सिर्फ एक ही समस्या और कारण यह है कि DataTemplateSelector एक ContentControl के लिए लागू किया गया है लेकिन मेरे व्युत्पन्न नियंत्रण के लिए मेरे व्युत्पन्न नियंत्रण के लिए ControlTemplate में छिपा हुआ था।

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

आशा इस मदद करता है: मैं बस ContentTemplateSelector के लिए बाध्यकारी टेम्पलेट जोड़ने के लिए भूल गया था।

+0

धन्यवाद। उसने मुझे कुछ सिक्के बचाए। – dotNET

संबंधित मुद्दे