MVVM,XML和主/详细方案

时间:2011-10-11 04:39:40

标签: c# xml linq mvvm master-detail

我正在使用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 - &gt; Aisle - &gt; 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>
}

主/细节场景中将有三个组合框(商店,过道和货架)。将查询数据以告诉我哪些商店可用,商店中的哪个过道正在使用,然后在每个过道上使用哪个货架。建立<Container\>后,该容器中的<Item(s)\>将绑定到用户控件。

此时,我不确定如何处理数据。在进入MVVM路由之前,我收集了每个SelectedItem的字符串,并将它们用作XElement Linq查询的输入。这将返回<Container\>,然后我将查询<Item(s)\>

当我对任何组合框进行更改时,我想利用绑定并避免所有查询。如何使用绑定将选定的<Container\>返回到viewmodel中的属性?

欢迎提供所有帮助和建议!

1 个答案:

答案 0 :(得分:0)

即使您在后面使用查询,您仍然可以使用绑定(为什么不使用) - 您只需要通过一个ComboBox-Change(以及ViewModel中的绑定值)触发正确的INotifyPropertyChanges - 像这样:

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应绑定到您的Aisles-Combobox的Itemsource - 您需要.ToString()中的ItemTemplate或右Aisles重载来显示您喜欢的内容。如果您不喜欢此方法,请在AvaiableAisles之前使用.Select(...)更改.ToArray()以选择字符串并将签名更改为IEnumerable<string> AvaiableAisles
  • 我不介意任何错误处理,例如使用_currentStore
  • 如果您还没有完成,则必须使用Implemet INotifyPropertyChanged
  • 您必须实现FindStore - 这是查询部分
  • 的位置