我有个问题.也许有人可以(拜托!)帮助。我使用的是一个具有和枚举类型的模型,以及一个属性,它应该包含每个从枚举中选择的类型的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}"/>问题:在我创建的由ruleEditTemplateSelector返回的ruleEditTemplateSelector中,DataContext是类型(同意),但是我需要访问editedModel来创建数据模板.我不知道如何处理它
提前感谢!
发布于 2012-05-31 07:23:52
解决办法不是很难..。
DataContext="{Binding RelativeSource={RelativeSource AncestorType=ContentControl},Path=DataContext}"通过这种方式,模板的上下文与他的父母的内容是相同的,我可以访问他的成员。我想我想这么做,但我没有正确编码.谢谢Cstein的参与!
发布于 2012-05-25 09:38:07
如果我对您的理解正确,您希望在模板选择器中创建您的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>内容控制和列表框保持不变。
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;
}
}这将根据项目的类型返回现有的数据板。我希望我对你的理解是对的,这对你有帮助。
https://stackoverflow.com/questions/10751419
复制相似问题