2012-05-25 15 views
5

Mam problem enoyingowy ... Może ktoś może (proszę!) Pomóc. Używam model, który posiada i wyliczenie rodzajów i właściwości, które powinny utrzymać modele UI dla każdego wybranego typu z wyliczeniem: Zdefiniujmy je jak:ContentControl z DataTemplateSelector - potrzebna pomoc

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

Chcę mieć kontrolę treści, które używają datatemplateselector do zmieniaj jego widok za każdym razem, gdy zmieniam 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}"/> 

Problem: W DataTemplates że tworzę zostać zwrócone przez ruleEditTemplateSelector DataContext jest Rodzaj (zgadzam się z tym), ale muszę dostęp do editedModel utworzyć mój DataTemplate ... robię nie wiem jak sobie z tym poradzić

Z góry dziękuję!

Odpowiedz

10

Rozwiązanie nie bardzo trudno było ....

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

W ten sposób kontekst szablonu jest taka sama z treścią jego rodzica i mogę acces jego członków. Myślę, że próbuję to zrobić, ale nie zakodowałem poprawnie ... Dziękuję Csteinowi za zaangażowanie!

+0

dzięki! Długo szukałem tego rozwiązania. – theateist

2

Jeśli dobrze cię rozumiem, chcesz utworzyć DataTemplate wewnątrz templateselector, podczas gdy datatemplate jest oparty na właściwości editedModel.

chciałbym rozwiązać ten problem w ten sposób:

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 i listbox pozostają takie same.

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

to powrót istniejący DataTemplate w zależności od rodzaju elementu. Mam nadzieję, że zrozumiałem cię dobrze i to ci pomaga.

+0

Nie ... to nie jest mój problem. Znam przepływ pracy. problem tkwi w szablonie A, B, C. ponieważ editedModel.PropertyName nie został znaleziony. (kontekst danych jest selectedType ...) – Victor

+0

Jeśli twój datacontext Window.xaml jest twój viewmodel i umieścić swoje datatemplates w znaczniku Window.Resources, to możesz uzyskać dostęp do editedModel.PropertyName z DataTemplate – csteinmueller

+0

Tak Mam DataTemplate w systemie Windows. Zasoby i nie ... niestety powiedział, że nie ma żadnych: editedModel.PropertyName w sectedType .... wiedźma jest prawdą ... – Victor

Powiązane problemy