我知道这是糟糕的设计,但我需要从我的 View 模型访问 View 。这是因为我有一些旧控件,例如Winforms 控件,不支持绑定(bind),需要用代码填充。

我正在使用 AvalonDock 2.0 的 MVVM 模型并且有类似的东西:

   <ad:DockingManager x:Name="dockManager"
                  DocumentsSource="{Binding Files}"
                  AnchorablesSource="{Binding Tools}"
        ActiveContent="{Binding ActiveDocument, Mode=TwoWay, Converter={StaticResource ActiveDocumentConverter}}">
        <ad:DockingManager.LayoutItemTemplateSelector>
            <local:PanesTemplateSelector>
                <local:PanesTemplateSelector.NavigationViewTemplate>
                    <DataTemplate>
                        <tvext:TreeViewExtended />
                    </DataTemplate>
                </local:PanesTemplateSelector.NavigationViewTemplate>
            </local:PanesTemplateSelector>
        </ad:DockingManager.LayoutItemTemplateSelector>

因此模板 NavigationViewTemplate 绑定(bind)到集合 Tools 的一项,即我的 NavigationViewModel 类型的 ViewModel。

我没有问题绑定(bind)例如一个 TextBox 到我的 View 模型的属性。但我不知道如何从我的 NavigationViewModel 访问模板内的 tvext:TreeViewExtended 控件以填充它。

蒂亚迈克尔

最佳答案

我建议您不要从 ViewModel 访问 Winforms 控件。将与 View 相关的所有内容保留在 View 中。您可以按如下方式执行此操作:

  • 创建一个 WPF 自定义控件,例如名为 TreeViewExtendedWrapper 。 (有关如何创建自定义 WPF 控件的简短教程,请参阅 this article)。
  • 在自定义控件的控件模板内(在 Themes\Generic.xaml 文件中),放置您的 Winforms 控件:
    <ControlTemplate TargetType="{x:Type local:TreeViewExtendedWrapper}">
        <Border Background="{TemplateBinding Background}"
            BorderBrush="{TemplateBinding BorderBrush}"
            BorderThickness="{TemplateBinding BorderThickness}">
            <tvext:TreeViewExtended />
        </Border>
    </ControlTemplate>
    
  • 将依赖属性添加到您需要绑定(bind)到 ViewModel 的所有 Winforms 控件属性的自定义控件中。
  • 还将依赖属性添加到您需要绑定(bind)到 View 模型的所有命令的自定义控件中。
  • 在自定义控件的代码隐藏中编写 C# 代码,将自定义控件的依赖属性连接到 Winforms 控件的属性、事件和方法。
  • 在您的数据模板中,将您的自定义控件与任何必要的数据绑定(bind)一起放置:
    <DataTemplate>
        <local:TreeViewExtendedWrapper MyProperty={Binding MyProperty}/>
    </DataTemplate>
    

  • 通过这种方式,您可以使用数据绑定(bind)来连接 ViewModel 和 Winforms 控件,即您不违反 MVVM 原则。

    关于wpf - 从 View 模型访问 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11246715/

    10-16 13:22
    查看更多