2012-05-25 15 views
5

मुझे एक परेशानी की समस्या मिली ... शायद कोई (कृपया!) मदद कर सकता है। मैं एक मॉडल है कि और प्रकार की गणना और एक संपत्ति है कि गणना से प्रत्येक चयनित प्रकार के लिए यूआई मॉडल धारण करना चाहिए उपयोग कर रहा हूँ: उन्हें पसंद के परिभाषित करते हैं:DataTemplateSelector के साथ ContentControl - मदद की आवश्यकता

class ViewModel 
    { 
    Types selectedType{get;set;} 
    UiModelBase editedModel{get;set;} 
    } 

मैं एक सामग्री नियंत्रण है कि करने के लिए datatemplateselector का उपयोग करना चाहते हैं प्रत्येक बार जब मैं चयनित टाइप बदलता हूं तो उसका विचार बदलें।

<ListBox x:Name="RuleTypeList" ItemsSource="{Binding Source={StaticResource Types}}" SelectedItem="{Binding Path=selectedType}"/>  
    <!--Content control--> 
    <ContentControl ContentTemplateSelector="{StaticResource ruleEditTemplateSelector}" 
      Content="{Binding SelectedItem, ElementName=RuleTypeList}"/> 

समस्या: DataTemplates कि मैं ruleEditTemplateSelector द्वारा दिए जाते बनाने में DataContextप्रकार (इससे सहमत) है लेकिन मैं अपने DataTemplate बनाने के लिए editedModel के लिए उपयोग की जरूरत है ... मैं पता नहीं कैसे

अग्रिम धन्यवाद!

उत्तर

10

समाधान नहीं बहुत मुश्किल था ....

DataContext="{Binding RelativeSource={RelativeSource AncestorType=ContentControl},Path=DataContext}" 

इस तरह टेम्पलेट के संदर्भ अपने मूल की सामग्री के साथ एक ही है और मैं उसके सदस्यों acces कर सकते हैं। मुझे लगता है कि मैं ऐसा करने की कोशिश करता हूं लेकिन मैंने सही कोड नहीं किया ... शामिल होने के लिए धन्यवाद कस्टिन!

+0

धन्यवाद! मैं इस समाधान को लंबे समय से ढूंढ रहा था। – theateist

2

यदि मैं आपको सही समझता हूं तो आप tem टेम्पलेट चयनकर्ता के अंदर अपना डेटा टेम्पलेट बनाना चाहते हैं, जबकि डेटामैप्लेट संपादित मॉडेल प्रॉपर्टी पर आधारित है।

Windows.xaml:

मैं इस समस्या को इस तरह का समाधान होगा

<Window.Resources> 
    <local:Selector x:Key="sel"/> 

    <DataTemplate x:Key="templateA"> 
     <TextBlock Text="{Binding editedModel.PropertyName}"/> 
    </DataTemplate> 

    <DataTemplate x:Key="templateB"> 
     <TextBlock Text="{Binding editedModel.PropertyName}"/> 
    </DataTemplate> 

    <DataTemplate x:Key="templateC"> 
     <TextBlock Text="{Binding editedModel.PropertyName}"/> 
    </DataTemplate> 

</Window.Resources> 

ContentControl और लिस्टबॉक्स ही रहते हैं।

DataTemplateSelector:

public class Selector : DataTemplateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     if (item is ClassA) 
      return (container as FrameworkElement).FindResource("TemplateA") as DataTemplate; 
     else if (item is ClassB) 
      return (container as FrameworkElement).FindResource("TemplateB") as DataTemplate; 
     else if (item is ClassC) 
      return (container as FrameworkElement).FindResource("TemplateC") as DataTemplate; 
     return null; 
    } 
} 

इस आइटम की प्रकार के आधार पर एक मौजूदा DataTemplate लौट आते हैं। मुझे उम्मीद है कि मैं आपको सही समझता हूं और यह आपकी मदद करता है।

+0

नहीं ... यह मेरी समस्या नहीं है। मुझे वर्कफ़्लो पता है। समस्या टेम्पलेट ए, बी, सी के अंदर है। क्योंकि संपादित मॉडेल। प्रॉपर्टी नाम नहीं मिला है। (डेटा संदर्भ selectedType है ...) – Victor

+0

अपने Window.xaml के DataContext अपने viewmodel है और आप Window.Resources टैग में अपनी datatemplates डाल तो आप हाँ मैं Windows में DataTemplate है अपने DataTemplate – csteinmueller

+0

से अपने editedModel.PropertyName का उपयोग कर सकते हैं। संसाधन और नहीं ... दुर्भाग्यवश यह कहा गया कि इसे कोई नहीं मिला: संपादित मॉडेल.प्रॉपर्टी नाम sected टाइप में .... चुड़ैल सच है ... – Victor

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