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

时间:2015-11-26 07:10:23

标签: c# wpf data-binding datatemplate

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

1 个答案:

答案 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>
相关问题