MVVM、XML和主/详细场景

本文关键字:XML 和主 MVVM | 更新日期: 2023-09-27 18:10:50

我正在c#中进行我的第一个MVVM项目,从非MVVM项目的转换,并且在每个角落都有问题。虽然我不能分享我正在使用的确切数据,但我已经提出了一个类似的场景,这将有助于解决我的问题。

数据如下:

   <Stock>
      <Container Store="Store1"
                 Aisle="1"
                 Shelf="2"
                 Name="Box1">
         <Item Name="GreenBeans"/>
         <Item Name="Carrots"/>
         ...
      </Container>
      <Container Store="Store3"
                 Aisle="4"
                 Shelf="6"
                 Name="Box2">
         <Item Name="Pillow"/>
         <Item Name="Blanket"/>
         ...
      </Container>
      ...
   </Stock>

可能有数千个容器,每个容器有10-15个物品。任意两个定位器(Store/Aisle/Shelf)可能是相等的,但不是所有三个(即一个容器可以存在于某个位置Store -> Aisle -> Shelf)。

我当前的模型类如下。这些不是完整的模型,但这给了我一个思路。有可能,但不太可能,我需要知道特定商店或特定通道上的所有<Item'>。说了这么多,我必须上这些课吗?

public class Store
{
   public String StoreName;
   public Aisles StoreAisles; 
}
public class Stores
{
   ObservableCollection<Store>
}
public class Aisle
{
   public int AisleNumber;
   public Shelfs AisleShelfs;
}
public class Aisles
{
   ObservableCollection<Aisle>
}
public class Shelf
{
  public int ShelfNumber;
  public Items ShelfItems;
}
public class Shelfs
{
   ObservableCollection<Shelf>
}
public class Item
{
   public string Name;
}
public class Items
{
   ObservableCollection<Item>
}

在主/细节场景中将有三个组合框(Stores, Aisles和Shelfs)。将查询数据以告诉我哪个商店是可用的,商店的哪个通道正在使用,然后每个通道上的哪个货架正在使用。一旦建立了<Container'>,那么在该容器中的<Item(s)'>将被绑定到一个用户控件。

在这一点上,我不确定如何处理数据。在使用MVVM路由之前,我正在从每个SelectedItem收集字符串,并将这些字符串用作XElement Linq查询的输入。这将返回一个<Container'>,然后我将在其中查询<Item(s)'>

我想利用绑定的优势,并在更改任何组合框时避免所有查询。我如何使用绑定返回选定的<Container'>到视图模型中的属性?

欢迎所有的帮助和建议!

MVVM、XML和主/详细场景

即使你在后面使用查询,你仍然可以使用绑定(为什么不呢)-你只需要触发适当的INotifyPropertyChanges作为一个ComboBox-Changing的结果(和它的绑定值在你的ViewModel) -像这样:

public string SelectedStoreName
{
   get { return _storeName; }
   set {
      if (!Equals(value, _storeName))
      {
         _storeName = value;
         _currentStore = FindStore(value);
         OnPropertyChanged("SelectedStoreName"); // invokes INotifyPropertyChanged
         OnPropertyChanged("AvaiableAisles");
      }
   }
}
public IEnumerable<Aisles> AvaiableAisles
{
    get { return _currentStore.StoreAisles.ToArray(); }
}
/* same with the rest of your chain */

请注意以下几点:

  • SelectedStoreName应该绑定到你的Store-Combobox,如果你不喜欢字符串部分改变它(但我认为没有必要)
  • AvaiableAisles应该被绑定到你的过道组合框的Itemsource -你将需要一个ItemTemplate或正确的.ToString()过载在Aisles显示你喜欢的内容。如果您不喜欢这种方法,在.ToArray()之前用.Select(...)更改AvaiableAisles以选择字符串并将签名更改为IEnumerable<string> AvaiableAisles
  • 我不介意任何错误处理,例如使用_currentStore
  • 你必须实现INotifyPropertyChanged如果你没有allready
  • 你必须实现FindStore -这是查询部分是