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)'>
将被绑定到一个用户控件。
<Container'>
,然后我将在其中查询<Item(s)'>
。
我想利用绑定的优势,并在更改任何组合框时避免所有查询。我如何使用绑定返回选定的<Container'>
到视图模型中的属性?
欢迎所有的帮助和建议!
即使你在后面使用查询,你仍然可以使用绑定(为什么不呢)-你只需要触发适当的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
-这是查询部分是