gpt4 book ai didi

wpf - 从 Viewmodel 访问 View

转载 作者:行者123 更新时间:2023-12-04 21:46:22 24 4
gpt4 key购买 nike

我知道这是不好的设计,但我需要从我的 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)问题,例如一个文本框到我的 View 模型的一个属性。但我不知道如何从我的 NavigationViewModel 访问模板内的 tvext:TreeViewExtended 控件以填充它。

TIA 迈克尔

最佳答案

是的,我不是让 ViewModel 知道 View 的忠实粉丝,但是既然你问了,这里有一个想法:

 1. Create an interface for your View (if you haven't already) and add whatever functionality to that interface that you need access to from the ViewModel. Lets call it ISomeView
2. add/implement the interface on the View
3. add property to the ViewModel ISomeView View {get;set;}
4. in the view depending where the ViewModel is being injected assign populate the ViewModel's property, for example you can do it on DataContextChanged:

private void OnDataContextChanged (object sender, ...EventArgs e)
{
// making up your ViewModel's name as ISomeViewModel
((ISomeViewModel)sender).View = this;
}

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com