我正在使用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中的属性?
欢迎提供所有帮助和建议!
答案 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
FindStore
- 这是查询部分