如何绑定关于 DataContext 的局部变量

How to bind local variable respecting DataContext

WPF 有点问题。我希望我能很好地解释我的问题,它不会混淆太多。

使用多个视图,我有一个 属性 存储 "Active" 视图。

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。

数据模板:

<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>

我的问题是,我不知道如何动态显示 属性 数据类型。在我刚刚将它与 ItemsControl 中的 Collections 一起使用之前。

我已经尝试使用 ItemsControl 并将 属性 绑定为 ItemsSource,但它不起作用。

有没有什么方法可以根据我的 属性 的数据类型显示元素,其中源不是集合?

完成工作:

<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>