ContentControl with DataTemplateSelector语言 - 需要帮助



我遇到了一个令人羡慕的问题...也许有人可以(请!)帮忙。我正在使用一个具有和枚举类型的模型和一个属性,该属性应该包含枚举中每个选定类型的 UI 模型:让我们像这样定义它们:

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}"/>

问题:在我创建的数据模板中由规则编辑模板选择器返回数据上下文类型(同意这一点),但我需要访问编辑的模型来创建我的数据模板......我不知道如何处理它

提前感谢!

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

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

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

如果我理解正确,您希望在模板选择器中创建数据模板,而数据模板基于编辑模型属性。

我会这样解决这个问题:

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

这将返回现有数据模板,具体取决于项的类型。我希望我理解正确,这对你有帮助。

最新更新