如何将 WPF 控件的内容绑定到其容器的 DataContext,以便我可以基于该对象应用 DataTemplateSelector?
-
15-11-2019 - |
题
我正在尝试将 WPF 窗口绑定到包含两个集合 A 和 B 的 ViewModel 顶部。我尝试使用 DataTemplates 显示 A 或 B,具体取决于 ViewModel 中标志的设置。
为此,我设置了窗口 DataContext = ViewModel
. 。但是,当我尝试绑定 ContentControl
到该 DataContext 并应用 DataTemplateSelector
对它来说, item
选择器的参数 SelectTemplate(object item, DependencyObject container)
方法始终为空:
<Window [snip] Title="MainWindow">
<Window.Resources>
<!-- DataTemplate and Selector declarations -->
</Window.Resources>
<Grid>
<ContentControl Content="{Binding}"
ContentTemplateSelector="{StaticResource templateSelector}" />
</Grid>
</Window>
我应该如何绑定它 ContentControl
这样 Window 的 ViewModel 将被传递到它的 DataTemplateSelector
?
解决方案
这对我有用:
<ContentControl Content="{Binding DataContext, RelativeSource={RelativeSource Self}}"
ContentTemplateSelector="{StaticResource templateSelector}" />
编辑:
不过,我同意亚伦的观点,这可能不是完成任务的最佳方式。你说你正在使用 ViewModel。最简单的方法可能是将 ItemsControl 绑定到 Viewmodel 上公开所需集合的新“SelectedCollection”属性。然后在您的标志中(假设它是一个属性),您可以为“SelectedCollection”触发 propertychanged。
其他提示
这里发生了很多事情...
你说你正在使用 DataTemplateSelector
显示集合 A 或集合 B,同时您声明要将其中一个集合设置为 DataContext
窗口的。
如果您想隐藏一个集合中的数据,请对集合本身执行过滤。另一种方法是通过 IValueConverter
或者 IMultiValueConverter
. 。另一种解决方案可能是将两个 UI 元素分别绑定到每个集合并更改 Visiblity
基于 ViewModel 中的值的 UI 元素。
有很多不同的选择...如果我理解正确的话 DataTemplateSelector
不应该是其中之一。