C# 如何根据DataContext绑定局部变量

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;

我对WPF有点问题。我希望我能很好地解释我的问题,不会让人太困惑

使用多个视图,我有一个存储“活动”视图的属性

经典视图模型:视图库

现代视图模型:视图库

财产:

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的元素。