gpt4 book ai didi

c# - MVVM 和控件创建

转载 作者:太空宇宙 更新时间:2023-11-03 11:39:18 24 4
gpt4 key购买 nike

想象一个简单的场景,其中包含一个按钮和一些空白区域的 WPF 窗口。单击该按钮会创建一个新的自定义/用户控件,并将其随机放置在窗口的某个位置。

单击这些控件之一会将其从窗口中删除。

现在我有了一个 ViewModel ala MVVM,它为“新建”按钮公开了一个 ICommand,但是创建新控件的代码在哪里?我猜每个控件都可能有自己的 ViewModel 来处理它的删除和定位。

是否可以在窗口上没有隐藏代码并且 ViewModel 不真正了解 View 的情况下实现?

最佳答案

导致创建控件的代码位于您的“主”ViewModel 中。

实际创建控件的代码是容器。

所以它会是这样的:

void AddControlCommandExecuted() {
var container = // resolve your DI container here

// Now use the container to resolve your "child" view. For example,
// if using UnityContainer it could go like this:
var view = container.Resolve<ChildView>();

// Of course you can also resolve the ViewModel if your program is
// "ViewModel-first" instead of "View-first".

// Does the ChildViewModel need some properties to be set?
var viewModel = (ChildViewModel)view.DataContext;
viewModel.StringProperty = "blah";

// Now get a reference to the region in your View which will host
// the "child" views.
var regionManager = container.Resolve<IRegionManager>();
var region = regionManager.Regions["MyRegionName"];

// Finally add the view to the region. You can do it manually, you
// can use the concept of "navigation" if your MVVM framework has one
// (I 'm using Prism, which does), etc etc.
region.Add(view);
}

更新:写答案时,我忘记了并非所有 MVVM 框架都像 Prism 那样具有区域。所以请原谅上面代码的特殊性,因为它并没有真正改变任何东西。您只需要自己构建类似 Region 抽象的东西。让我们看看:

class MyViewModel {
public event EventHandler<ChildViewModelAddedEventArgs> ChildViewModelAdded;
}

MyView 然后会为该事件附加一个事件处理程序,并从 ChildViewModelAddedEventArgs 中获取 ChildView 实例,以便可以添加它对于一个 ItemsControl,它是没有你的 ViewModel 弄乱这些细节的父级。

当然,这意味着您现在需要一些代码隐藏,但这无济于事,除非您使用本身提供此类服务的框架。

关于c# - MVVM 和控件创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5197818/

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