我有一个令人讨厌的问题......也许有人可以(请!)帮忙。 我使用的模型具有类型和枚举的属性,应该为枚举中的每个选定类型保存UI模型:让我们将它们定义为:
class ViewModel
{
Types selectedType{get;set;}
UiModelBase editedModel{get;set;}
}
我希望每次更改selectedType时都有一个使用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 ...我不知道如何处理它
提前致谢!
答案 0 :(得分:12)
解决方案不是很难......
DataContext="{Binding RelativeSource={RelativeSource AncestorType=ContentControl},Path=DataContext}"
通过这种方式,模板的上下文与他父母的内容相同,我可以访问他的成员。 我想我努力做到这一点,但我没有编码正确... 感谢Cstein的参与!
答案 1 :(得分: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和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。我希望我理解你,这对你很有帮助。