ContentControl с DataTemplateSelector - нужна помощь

У меня неприятная проблема... Может быть, кто-то может (пожалуйста!) Помочь. Я использую модель с перечислением типов и свойством, которое должно содержать модели пользовательского интерфейса для каждого выбранного типа из перечисления: давайте определим их следующим образом:

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

Я хочу иметь элемент управления контентом, который использует dateatemplateselector, чтобы изменять его представление каждый раз, когда я меняю 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}"/>

ПРОБЛЕМА: В DataTemplates, которые я создаю, чтобы они возвращались ruleEditTemplateSelector, DataContext имеет тип (согласен с этим), но мне нужен доступ к editedModel для создания моего DataTemplate... Я не знаю, как с этим справиться

Заранее спасибо!

2 ответа

Решение

Решение было не очень сложным....

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

Таким образом, контекст шаблона совпадает с содержанием его родителя, и я могу получить доступ к его членам. Я думаю, что пытался сделать это, но я не правильно написал код... Спасибо Cstein за участие!

Если я вас правильно понял, вы хотите создать свой DataTemplate внутри шаблона templateselector, в то время как шаблон данных основан на свойстве 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 и 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;
    }
}

Это возвращает существующую табличку с данными в зависимости от типа элемента. Надеюсь, я вас правильно понял, и это вам поможет.

Другие вопросы по тегам