2012-05-25 13 views
5

私は厄介な問題を抱えています...多分誰かが(できます!)助けてください。 私が持っているモデルと種類を列挙し、列挙から選択した各タイプのためのUIモデルを保持する必要があるプロパティを使用しています:私はdatatemplateselectorを使用したコンテンツコントロールを持ちたいContentControl with DataTemplateSelector - 助けが必要

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

:ようなものだが、それらを定義してみましょう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タイプ(それに同意する)であるが、私は私が...私のDataTemplateを作成するためにeditedModelにアクセスする必要がありますそれに対処する方法を知らない

ありがとうございます!

答えて

10

....

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

は、テンプレートのコンテキストには、彼の親の内容と同じであり、私は彼のメンバーをアクセスもできます。 私はそれをしようとしていると思いますが、私は正しいコードを書いていませんでした... Csteinが関与してくれてありがとう!

+0

ありがとう!私はこのソリューションを長い間探していました。 – theateist

2

あなたが正しく理解しているのであれば、データテンプレートはeditedModelプロパティに基づいているのに対し、テンプレートセレクタ内にDataTemplateを作成したいと思っています。

私はこの方法で、この問題を解決するだろう:

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があなたのビューモデルであり、あなたのデータ型をWindow.Resourcesタグに入れると、DataTemplateからeditedModel.PropertyNameにアクセスできます。 – csteinmueller

+0

はい私はWindowsにDataTemplateを持っています。リソースといいえ...残念ながら、sectedTypeのeditedModel.PropertyNameは見つかりませんでした.... witch is true ... – Victor