帮助需要 - ContentControl中有DataTemplateSelector(Conte

2019-06-24 18:49发布

我有一个问题enoying ...也许有人可以(请!)的帮助。 我使用的是有模式和类型枚举和应持有UI模式从枚举每个选定的类型的属性:让我们来定义它们,如:

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

我想有使用datatemplateselector内容控制每个I改变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 ......我不知道该如何处理呢

提前致谢!

Answer 1:

该解决方案是不是很辛苦....

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

这样模板的上下文是他父母的内容一样,我可以存取权限他的成员。 我想我tryind这样做,但我没有正确的代码...谢谢Cstein涉及!



Answer 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。 我希望我理解你的权利,它可以帮助你。



文章来源: ContentControl with DataTemplateSelector - help needed