我遇到了一个令人羡慕的问题...也许有人可以(请!)帮忙。我正在使用一个具有和枚举类型的模型和一个属性,该属性应该包含枚举中每个选定类型的 UI 模型:让我们像这样定义它们:
class ViewModel
{
Types selectedType{get;set;}
UiModelBase editedModel{get;set;}
}
我希望有一个内容控件,该控件使用数据模板选择器在每次更改 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}"/>
问题:在我创建的数据模板中由规则编辑模板选择器返回数据上下文是类型(同意这一点),但我需要访问编辑的模型来创建我的数据模板......我不知道如何处理它
提前感谢!
解决方案不是很难....
DataContext="{Binding RelativeSource={RelativeSource AncestorType=ContentControl},Path=DataContext}"
这样,模板的上下文与他父级的内容相同,我可以访问他的成员。我想我尝试这样做,但我的代码不正确......感谢Cstein的参与!
如果我理解正确,您希望在模板选择器中创建数据模板,而数据模板基于编辑模型属性。
我会这样解决这个问题:
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>
内容控件和列表框保持不变。
数据模板选择器:
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;
}
}
这将返回现有数据模板,具体取决于项的类型。我希望我理解正确,这对你有帮助。