我对WPF有点问题。我希望我能很好地解释我的问题,这不会让人感到困惑。
使用多个视图我有一个存储“活动”视图的属性。
Classic_View_Model:View_Base
Modern_View_Model:View_Base
属性:
private View_Base activeView;
public View_Base ActiveView
{
get { return activeView; }
set
{
this.activeView = value;
OnPropertyChanged(PropertyExtensions.GetPropertyName(() => ActiveView));
}
}
因为我的每个视图都应该显示不同,我也有多个DataTemplates。
的DataTemplates:
<DataTemplate x:Key="ClassicViewTemplate" DataType="{x:Type views:Classic_View}">
<views:Classic_View DataContext="{Binding ClassicView}" ></views:Classic_View>
</DataTemplate>
<DataTemplate x:Key="ModernViewTemplate" DataType="{x:Type views:Modern_View}">
<views:Modern_View DataContext="{Binding ModernView}" ></views:Modern_View>
</DataTemplate>
我的问题是,我不知道我如何能够动态显示一个关于DataType的属性。在我刚刚将它与ItemsControl中的集合一起使用之前。
我已经尝试过使用ItemsControl并将该属性绑定为ItemsSource,但它可以正常工作。
有没有办法根据我的属性的DataType显示一个元素,其中source不是一个集合?
Dosent工作:
<ItemsControl ItemsSource="{Binding ActiveView}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
答案 0 :(得分:0)
好的,我自己得到了解决方案。
需要的是一个ContentTemplateSelector来处理差异。
public class ViewSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is Views.Classic_View_Model)
return (container as FrameworkElement).FindResource("ClassicViewTemplate") as DataTemplate;
else if (item is Views.Modern_View_Model)
return (container as FrameworkElement).FindResource("ModernViewTemplate") as DataTemplate;
return null;
}
}
然后创建DataTemplateSelector的本地实例:
<Window.Resources>
<local:ViewSelector x:Key="viewSelector"/>
</Window.Resources>
ContentControl应如下所示:
<ContentControl Content="{Binding ActiveView}" ContentTemplateSelector="{StaticResource viewSelector}"></ContentControl>
为了使绑定工作,我还必须修改我的DataTemplates并绑定到&#34; ActiveView&#34;在ContentControl中设置:
<DataTemplate x:Key="ClassicViewTemplate" DataType="{x:Type views:Classic_View_Model}">
<views:Classic_View DataContext="{Binding}" ></views:Classic_View>
</DataTemplate>
<DataTemplate x:Key="ModernViewTemplate" DataType="{x:Type views:Modern_View_Model}">
<views:Modern_View DataContext="{Binding}" ></views:Modern_View>
</DataTemplate>