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(同意这一点),但我需要访问editedModel 来创建我的DataTemplate ...我不知道如何处理它

提前致谢!

4

2 回答 2

13

解决方案不是很困难....

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

这样模板的上下文与他父母的内容相同,我可以访问他的成员。我想我试着这样做,但我没有正确编码......感谢 Cstein 参与!

于 2012-05-31T07:23:52.013 回答
2

如果我理解你的话,你想在模板选择器中创建你的 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>

内容控件和列表框保持不变。

数据模板选择器:

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 回答