C# 如何根据DataContext绑定局部变量
我对WPF有点问题。我希望我能很好地解释我的问题,不会让人太困惑 使用多个视图,我有一个存储“活动”视图的属性 经典视图模型:视图库 现代视图模型:视图库 财产:C# 如何根据DataContext绑定局部变量,c#,wpf,data-binding,datatemplate,C#,Wpf,Data Binding,Datatemplate,我对WPF有点问题。我希望我能很好地解释我的问题,不会让人太困惑 使用多个视图,我有一个存储“活动”视图的属性 经典视图模型:视图库 现代视图模型:视图库 财产: private View_Base activeView; public View_Base ActiveView { get { return activeView; } set { this.activeView = value;
private View_Base activeView;
public View_Base ActiveView
{
get { return activeView; }
set
{
this.activeView = value;
OnPropertyChanged(PropertyExtensions.GetPropertyName(() => ActiveView));
}
}
因为我的每个视图都应该显示不同,我还有多个数据模板
数据模板:
<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>
我的问题是,我不知道如何显示数据类型dynamicali的一个属性。在此之前,我只是将它用于ItemsControl中的集合
我已经尝试使用ItemsControl并将该属性绑定为ItemsSource,但没有成功
如果源不是集合,是否有任何方法可以基于my属性的数据类型显示元素
剂量工作:
<ItemsControl ItemsSource="{Binding ActiveView}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
好的,我自己找到了解决方案 所需要的是一个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>
您正在谈论的是哪一种财产?你的问题不清楚。您已经在为差异数据类型使用DataTemplates。“在源不是集合的情况下,是否可以基于my属性的数据类型显示元素?”--当然,ContentControl
将基于其DataTemplate
显示单个项。不幸的是,你的问题不清楚。标题意味着您希望绑定到局部变量,这是完全不可能的。这篇文章的其余部分似乎问了一些不同的问题,但我不确定是什么。请提供一个能清楚显示您正在做什么的示例,并精确解释代码的作用以及它与您想要的不同之处。让我们再试一次:我有一个变量“ClassicView”、一个变量“ModernView”和一个变量“ActiveView”。ActiveView是基本类型“基本视图”的类型。我想实现,我可以显示我的“动态视图”。根据存储在(ClassicView或ModernView)中的类型,我希望显示不同的用户控件。也许我做错了什么,但ContentControl也不起作用一个只根据呈现的项目类型做出决定的DataTemplateSelector
,很奇怪,假设DataTemplate
本身就可以实现这一点。也许您可以向我展示控件在没有DataTemplateSelector的情况下如何工作。我有DataTemplates和一个变量,可以在其中存储不同类型的对象。我希望有一个基于类型使用DataTemplate的元素。