gpt4 book ai didi

Silverlight 与 MVVM 继承 : ModelView and View matching the Model

转载 作者:行者123 更新时间:2023-12-03 10:15:30 26 4
gpt4 key购买 nike

今天我有一个关于 Silverlight (4 RC) MVVM 和继承概念的特殊问题,并正在寻找最佳实践解决方案......我认为我了解 MVVM 背后的基本思想和概念。我的模型对 ViewModel 一无所知,因为 ViewModel 本身不知道 View。 ViewModel 知道 Model,Views 知道 ViewModel。

想象以下基本(示例)场景 (我试图保持简短和简单):

我的模型包含 ProductBase具有一些基本属性的类,SimpleProduct : ProductBase添加更多属性和ExtendedProduct : ProductBase添加另一个属性。根据这个模型,我有几个 ViewModel,最重要的 SimpleProductViewModel : ViewModelBaseExtendedProductViewModel : ViewModelBase .最后但同样重要的是,根据查看 SimpleProductViewExtendedProductView .将来,我可能会添加许多产品类型(以及匹配的 View + 虚拟机)。

1. 收到Model集合时如何知道创建哪个ViewModel?
调用我的数据提供者方法后,最终会得到 List<ProductBase> .例如,它包含一个 SimpleProduct 和两个 ExtendedProduct。如何将结果转换为 ObservableCollection<ViewModelBase>拥有正确的 ViewModel 类型 (一个 SimpleProductViewModel 和两个 ExtendedProductViewModels)?

可能检查模型类型并相应地构造 ViewModel,即

foreach(ProductBase currentProductBase in resultList)
if (currentProductBase is SimpleProduct)
viewModels.Add(
new SimpleProductViewModel((SimpleProduct)currentProductBase));

else if (currentProductBase is ExtendedProduct)
viewModels.Add(
new ExtendedProductViewModels((ExtendedProduct)currentProductBase));
...
}

...但我认为这是非常糟糕的做法,因为此代码不遵循面向对象的设计。反过来,提供抽象工厂方法会将代码简化为:
foreach(ProductBase currentProductBase in resultList)
viewModels.Add(currentProductBase.CreateViewModel())

并且将是完全可扩展的,但由于模型不知道 View 模型,这是不可能的。我可能会在这里将界面引入游戏,但我还没有看到这种方法得到证实。

2. 选择 V​​iewModel 时如何知道要显示哪个 View?
这是几乎相同的问题,但在更高的层次上。最终得到了想要的 ObservableCollection<ViewModelBase>集合将要求主视图为 ViewModel 选择匹配的 View 。

在 WPF 中,有一个 DataTemplate可以根据定义的 DataType 提供 View 的概念。不幸的是,这在 Silverlight 中不起作用,我发现的唯一替代品是 ResourceSelector。的 SLExtensions 错误且不令人满意的工具包。

除此之外,问题 1 中的所有问题也适用。

Do you have some hints or even a solution for the problems I describe, which you hopefully can understand from my explanation?



先感谢您!

托马斯

最佳答案

我做这种事情是为了让 MVVM 成为强类型。

我定义了一些基本的接口(interface)

public interface IModel
{
}

public interface IViewModel
{
}

public interface IViewModel<M> : IViewModel
where M : IModel
{
void Bind(M model);
}

public interface IView
{
}

public interface IView<VM> : IView
where VM : IViewModel
{
void Bind(VM viewModel);
}

这提供了我的模型、模型 View 和 View 之间的基本关系。

我为 IModel 创建抽象实现和通用 IViewModel<> & IView<>接口(interface)。
public abstract class ModelBase : IModel
{
}

public abstract class ViewModelBase<M> : IViewModel<M>
where M : IModel
{
public abstract void Bind(M model);
}

public abstract class ViewBase<VM> : IView<VM>
where VM : IViewModel
{
public abstract void Bind(VM viewModel);
}

然后我使用这些来定义实际的具体对象——当然首先是接口(interface)。
public interface IPersonModel : IModel
{
}

public interface IPersonViewModel : IViewModel<IPersonModel>
{
}

public interface IPersonView : IView<IPersonViewModel>
{
}

注意接口(interface)的继承如何锁定类型关系。

现在可以定义具体的类。
public class PersonModel : ModelBase, IPersonModel
{
}

public class PersonViewModel : ViewModelBase<IPersonModel>, IPersonViewModel
{
public override void Bind(IPersonModel model)
{
throw new NotImplementedException();
}
}

public class PersonView : ViewBase<IPersonViewModel>, IPersonView
{
public override void Bind(IPersonViewModel viewModel)
{
throw new NotImplementedException();
}
}

所以给定一个模型,我可以寻找一个实现 IViewModel<M> 的对象。对于那个模型&给定一个 View 模型,我可以寻找 IView<VM>对于该 View 模型。

在这里可以使用依赖注入(inject)框架来进行查找。

我希望这有帮助。

关于Silverlight 与 MVVM 继承 : ModelView and View matching the Model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2629579/

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