2012-05-25 6 views
5

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

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

Я хочу иметь контроль контента, которые используют 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}"/> 

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

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

ответ

10

Решение не очень трудно было ....

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

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

+0

спасибо! Я искал это решение в течение длительного времени. – theateist

2

Если я правильно понимаю, что вы хотите создать свой DataTemplate внутри шаблона, тогда как шаблон данных основан на свойстве editModel.

Я бы решить эту проблему таким образом:

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

Это возвращает существующий DataTemplate в зависимости от типа элемента. Надеюсь, я понял тебя правильно, и это тебе помогает.

+0

Нет ... это не моя проблема. Я знаю рабочий процесс. проблема находится внутри шаблона А, В, С. потому что editModel.PropertyName не найден. (контекст данных выбранType ...) – Victor

+0

Если ваш файл datacontext Window.xaml является вашей моделью просмотра, и вы помещаете свои datatemplates в тег Window.Resources, то вы можете получить доступ к вашему editModel.PropertyName из вашего DataTemplate – csteinmueller

+0

Да У меня есть DataTemplate в Windows. Ресурсы и нет ... к сожалению, он сказал, что не находит: editModel.PropertyName в sectedType .... witch is true ... – Victor