wpf - 将父 View DataContext绑定(bind)到DataTemplate subview DataContext

标签 wpf xaml mvvm data-binding datatemplateselector

我最近一直在尝试使用WPF,Xaml,MVVM和DependencyInjection。因此,我正在使用MVVM原理创建UI。 UI的特定部分设计为充当向导,其中并非所有可用选项都同时显示给用户。选项的每个部分都是其自己的 View ( subview ),其中一个 View (父 View )将这些 subview 托管在ContentControl中。用户设置某些选项并使用按钮从一个部分移至另一部分。

查看导航

为了在这些 View 之间切换,我使用了一个DataTemplateSelector,每个 subview 在Xaml资源中都定义为DataTemplate。

主 View 中的内容控制:

        <ContentControl Content="{Binding ElementName=ParentViewControl, Path=ViewState, Mode=TwoWay}"
                    ContentTemplateSelector="{StaticResource MyTemplateSelector}" />

subview 数据模板示例:
    <DataTemplate x:Key="SubViewATemplate">
        <local:SubViewAView x:Name="SVAView" DataContext="{Binding ElementName=ParentViewControl, Path=DataContext}" ViewState="{Binding ElementName=ParentViewControl, Path=ViewState, Mode=TwoWay }" />
    </DataTemplate>

在父 View 和每个 subview 上,我创建了一个名为ViewState(一个枚举)的依赖项属性。这些通过DataTemplates相互绑定(bind)。在每个View的后台代码中,我根据用户输入更新此ViewState属性,并将其传播到父 View ,该父 View 又触发了DataTemplateSelector。到目前为止,一切都很好。导航效果很好。

ViewModel信息

父 View 具有一个ViewModel,它实现INotifyPropertyChanged作为其DataContext。我正在尝试使用单个ViewModel将属性绑定(bind)到父 View 和 subview 。问题是上面的DataTemplate代码段中的DataContext绑定(bind)不起作用。 (这对我来说很奇怪,因为ViewState绑定(bind)确实如此。)经过各种尝试使它起作用, subview 上的DataContext为null或ViewState控制变量。

我目前正在使用UnityContainer作为依赖项注入(inject)器。

各种尝试

这是我尝试过的其他所有失败的事情:

1)在UnityContainer中将ViewModel注册为单例,从而在子View上使用构造函数注入(inject)来设置DataContext。 (不起作用,因为DataTemplate资源必须有一个无参数构造函数。)

2)在UnityContainer中将ViewModel注册为单例,然后在 subview 上使用属性注入(inject)来设置DataContext。 (不起作用。我认为这是由于在Xaml中实例化对象时UnityContainer无法起作用。)

3)为每个需要ViewModel来显示父ViewModel上已经存在的属性的子View创建sub-ViewModels。我以前使用过此方法来解决UnityContainer的Xaml实例化问题。然后,我用关联的子ViewModel替换DataTemplate中的DataContext绑定(bind)。 (由于某些原因,我的父 View 的DataContext被设置为ViewState变量,而不是保留在 View 的构造方法中设置的ViewModel,因此不起作用。这又意味着父ViewModel的sub-ViewModel属性可以(未找到绑定(bind)到 subview 的DataContext的对象。)UserControls的Content和DataContext是否相同?设置一个会影响另一个吗?

4)将ViewState依赖项属性从View移到ViewModel,然后将ContentControl的Content设置为绑定(bind)到ViewModel。这违反了MVVM原则,但是到现在为止,我正尽一切努力使它起作用。 (这是行不通的,因为在 View 的代码背后更改ViewState时,ViewModel不会像更改一样触发。)由于我不想深入违反MVVM,因此我对此没有做任何进一步的研究。

结论

在过去的几天中,我在此站点上找到了大多数此类尝试的解决方案。我没有接受过WPF,Xaml和MVVM的正式培训,所以我怀疑我缺少明显的东西,或者正在尝试做一些不可能的事情。在找到可行的方法之前,我将继续尝试上述方法并进行研究,但我认为我会在此处利用集体知识来帮助我找到解决方案。

我希望让 View 组将单个ViewModel用作其DataContext,以便将属性绑定(bind)到其控件。并让 View 的导航由DataTemplateSelector控制。有没有办法做到这一点我没看到?

感谢您的时间!

最佳答案

之前我也遇到过类似的问题,使用RelativeSource绑定(bind)也很幸运。也许尝试这样的事情:

DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContentControl},Path=DataContext}"

只是一个想法。

关于wpf - 将父 View DataContext绑定(bind)到DataTemplate subview DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32767524/

相关文章:

c# - WPF MVVM 轻应用程序中的 SimpleIoc 问题

c# - 从 C# 代码生成包含触发器的 WPF 样式

c# - 在 Run 中指定相对 FontSize

windows-phone-7 - 我在哪里可以找到静态资源?

c# - WPF - 计算 FlowDocument 的宽度

xamarin - 如何为Xamarin native iOS和Android应用程序的新页面添加ViewModel

c# - 如何在 WPF MVVM 中将 View 的变量绑定(bind)到 ViewModel?

c# - 在 WPF 中绘制 tile-map 的最简单方法

c# - WPF ViewModel在另一个线程中运行方法,报告进度,更改Button的IsEnabled并显示结果

c# - 检索选项卡标题内容