如何将 WPF 控件的内容绑定到其容器的 DataContext,以便我可以基于该对象应用 DataTemplateSelector?

StackOverflow https://stackoverflow.com/questions/5036835

  •  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 不应该是其中之一。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top