6

私は厄介な問題を抱えています...誰かが(お願いします!)助けてくれるかもしれません。タイプの列挙と、列挙から選択された各タイプの UI モデルを保持する必要があるプロパティを持つモデルを使用しています。次のように定義しましょう。

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

selectedType を変更するたびに 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}"/>

問題: ruleEditTemplateSelector によって返されるように作成する DataTemplates では、DataContextType (それに同意します) ですが、DataTemplate を作成するには、editedModel にアクセスする必要があります...対処方法がわかりません

前もって感謝します!

4

2 に答える 2

13

解決策はそれほど難しくありませんでした....

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

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

于 2012-05-31T07:23:52.013 に答える
2

私があなたの言うことを正しく理解しているなら、datatemplateはeditedModelプロパティに基づいていますが、templateselector内に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とlistboxは同じままです。

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

これにより、アイテムのタイプに応じて既存のデータテンプレートが返されます。私はあなたを正しく理解し、それがあなたを助けることを願っています。

于 2012-05-25T09:38:07.820 に答える