问题
I got an enoying problem... Maybe someone can (please!) help. I am using a model that has and enumeration of types and a property that should hold UI models for each selected type from enumeration: Let's define them like:
class ViewModel
{
Types selectedType{get;set;}
UiModelBase editedModel{get;set;}
}
I want to have a content control that use datatemplateselector to change his view each time I change the 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}"/>
the PROBLEM: In DataTemplates that I create to be returned by ruleEditTemplateSelector the DataContext is Type (agree with that) but I need access to the editedModel to create my DataTemplate...I do not know how to deal with it
Thanks in advance!
回答1:
The solution was not very hard....
DataContext="{Binding RelativeSource={RelativeSource AncestorType=ContentControl},Path=DataContext}"
In this way the context of template is the same with the content of his parent and I can acces his members. I think I tryind to do that but I didn't code correct... Thanks Cstein for involving !
回答2:
If I understand you right you want to create your DataTemplate inside the templateselector, while the datatemplate is based on the editedModel property.
I would solve this problem this way:
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 and listbox stay the 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;
}
}
This return an existing datatemplate depending on the item's type. I hope I understood you right and it helps you.
来源:https://stackoverflow.com/questions/10751419/contentcontrol-with-datatemplateselector-help-needed