我对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,但它确实有效。
在源不是集合的情况下,有任何方法可以基于my的DataType显示元素吗?
剂量工作:
<ItemsControl ItemsSource="{Binding ActiveView}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>发布于 2015-11-26 08:11:45
好吧,我自己找到解决办法了。
需要的是一个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并绑定到ContentControl中设置的"ActiveView“:
<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>https://stackoverflow.com/questions/33932528
复制相似问题