如何绑定关于 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>
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>