我知道这是糟糕的设计,但我需要从我的 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 中。您可以按如下方式执行此操作:
TreeViewExtendedWrapper
。 (有关如何创建自定义 WPF 控件的简短教程,请参阅 this article)。 <ControlTemplate TargetType="{x:Type local:TreeViewExtendedWrapper}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<tvext:TreeViewExtended />
</Border>
</ControlTemplate>
<DataTemplate>
<local:TreeViewExtendedWrapper MyProperty={Binding MyProperty}/>
</DataTemplate>
通过这种方式,您可以使用数据绑定(bind)来连接 ViewModel 和 Winforms 控件,即您不违反 MVVM 原则。
关于wpf - 从 View 模型访问 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11246715/