2012-05-25 99 views
5

我得到了一個令人討厭的問題......也許有人可以(請!)幫助。 我使用的是有一個模式和類型枚舉和應持有UI模式從枚舉每個選定的類型的屬性:讓我們來定義他們喜歡:ContentControl與DataTemplateSelector - 需要幫助

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

我想有使用datatemplateselector的內容控制每次更改selectedType時更改其視圖。

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

的問題:在我創建由ruleEditTemplateSelector 返回的DataTemplates的DataContext的類型(同意這一點),但我需要訪問editedModel創建我的DataTemplate ......我不知道如何處理它

在此先感謝!

回答

10

的解決方案是不是很辛苦....

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

這樣模板的上下文是他父母的內容一樣,我可以存取權限他的成員。 我想我試着做,但我沒有編碼正確... 感謝Cstein的參與!

+0

謝謝!我一直在尋找這個解決方案。 – theateist

2

如果我理解你是對的,你想在templateselector內創建你的DataTemplate,而datatemplate是基於editedModel屬性。

我會解決這個問題是這樣的:

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

不......這不是我的問題。我知道工作流程。問題出在templateA,B,C裏面。因爲找不到editedModel.PropertyName。 (數據上下文是selectedType ...) – Victor

+0

如果您的Window.xaml的datacontext是您的viewmodel,並且您將數據模型放入Window.Resources標記,那麼您可以從DataTemplate訪問您的editedModel.PropertyName – csteinmueller

+0

是的我在Windows中有DataTemplate。資源和沒有......不幸的是它說它沒有找到任何:sectedType中的editedModel.PropertyName ....女巫是真的...... – Victor