WPF - MVVM大模型或大视图模型



我花了一些时间在WPF中搜索MVVM。我熟悉c#和WPF。我也了解MVVM及其好处。我真的不知道如何处理我的视图模型和模型,因为我看到的多个例子并不总是相同的。我知道MVVM很灵活,你可以"适应"。这是你的需要。

我会解释我的申请是关于什么的,然后问我的问题。

我将简化为送货和商品。它们都是来自SQL的表。我可以发出自己的SQL请求,并将行放入列表或可观察集合中,而不会出现任何问题。在应用程序中,您有一个交付列表,当您选择一个时,它的所有项目都会出现在旁边的另一个列表中。您可以添加/删除一个快递,添加/删除一个项目。您可以修改该项目的数量。注意,所有操作都会立即修改数据库。每个操作都有很多验证。

我已经以一种不太好的方式构建了应用程序(一个主窗口和所有其余的代码隐藏),我想使用MVVM重新构建它,即使它很难,因为它将是正确的方式。

我要做的是有2个模型和2个视图模型(delivery和Items)。我的旧应用程序有2个可观察集合,所以我想重用它来帮助我转移。我会把INotifyPropertyChanged放在视图模型中或者可能有一个基本视图模型。

问题:

我应该有一个observablecollections在模型和一个在视图模型?只有一个在视图模型中?简单的清单会更好吗?

这有点取决于第一个问题:我应该从我的DB在我的ViewModel收集数据,并把它放在一个可观察的集合?在模型中这样做更好吗?我已经看到它应该在模型中,甚至是另一个层。

这也取决于第一个问题:我应该把我的方法放在哪里,视图模型还是模型?我们说AddDelivery()。我所做的是将交付添加到我的observablecollection中,同时更新DB。那么现在,如果我只有一个observablecollection在我的视图模型,我需要有我的方法在同一个地方吗?如果你让我做2个可观察的集合呢?

编辑

在我得到的帮助下,我成功地启动了我的新应用程序!我现在被困在一个部分,一个视图模型如何与另一个视图模型通信?我在这两个模型中都有INotifyPropertyChanged。当我选择送货时,我需要更改我的observableCollection of Item。当我选择时,我已经有了NotifyPropertyChanged,我只需要从我的ItemViewModel订阅事件或向它发送消息?

模型:

public class Delivery
{
public string name { get; set; }
public string noDelivery{ get; set; }
}

public class Item
{
public string name { get; set; }
public string noItem { get; set; }
}

视图模型:

public abstract class ViewModelBase : INotifyPropertyChanged 
{

private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")  
{  
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}  
}

public class DeliveryViewModel : ViewModelBase
{
public ObservableCollection<Delivery> Deliveries{ get; private set;}
//Some Functions
}

public class ItemViewModel
{
public ObservableCollection<Item> Items { get; private set; }
//Some Functions
}

我在我的DeliveryViewModel中调用NotifyPropertyChanged,但我不知道其他视图模型如何使用它。换句话说,当事件发生在DeliveryViewModel时,我想从ItemViewModel调用一个函数。

答案:

  1. 根据最佳实践,你应该在视图模型中有一个可观察的集合。因为你的viewModel会连接到View而不是模型。

  2. 您应该始终首先从Model中的DB收集数据。这就是分离关注点的正确方式。然后你可以在你的ViewModel的ObservableCollection中添加相同的。

  3. 直接与DB交互的方法应该放在Models中。添加交付细节后的最终列表将在ViewModel ObservableCollection中重新获取或更新,并为其分配新的Id。

始终遵循关注点分离原则。因为MVVM是关于松散耦合的.

谢谢。

相关内容

  • 没有找到相关文章

最新更新