0
Q
使用MVVM
A
回答
8
如果我理解你的問題,你希望有下一個組合框填充數據基於以前的價值。
我有一個通用的視圖模型,你可以有捕獲項目的列表和所選擇的項目
class ItemListViewModel<T> : INotifyPropertyChanged where T : class
{
private T _item;
private ObservableCollection<T> _items;
public ItemListViewModel()
{
_items = new ObservableCollection<T>();
_item = null;
}
public void SetItems(IEnumerable<T> items)
{
Items = new ObservableCollection<T>(items);
SelectedItem = null;
}
public ObservableCollection<T> Items
{
get { return _items; }
private set
{
_items = value;
RaisePropertyChanged("Items");
}
}
public T SelectedItem
{
get { return _item; }
set
{
_item = value;
RaisePropertyChanged("SelectedItem");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
然後有將被綁定到視圖的DataContext的主視圖模型。使Load方法做你想做的事
class MyViewModel : INotifyPropertyChanged
{
public MyViewModel()
{
First = new ItemListViewModel<string>();
Second = new ItemListViewModel<string>();
Third = new ItemListViewModel<string>();
First.PropertyChanged += (s, e) => Update(e.PropertyName, First, Second, LoadSecond);
Second.PropertyChanged += (s, e) => Update(e.PropertyName, Second, Third, LoadThird);
LoadFirst();
}
public ItemListViewModel<string> First { get; set; }
public ItemListViewModel<string> Second { get; set; }
public ItemListViewModel<string> Third { get; set; }
private void LoadFirst()
{
First.SetItems(new List<string> { "One", "Two", "Three" });
}
private void LoadSecond()
{
Second.SetItems(new List<string> { "First", "Second", "Third" });
}
private void LoadThird()
{
Third.SetItems(new List<string> { "Firsty", "Secondly", "Thirdly" });
}
private void Update<T0, T1>(string propertyName, ItemListViewModel<T0> parent, ItemListViewModel<T1> child, Action loadAction)
where T0 : class
where T1 : class
{
if (propertyName == "SelectedItem")
{
if (parent.SelectedItem == null)
{
child.SetItems(Enumerable.Empty<T1>());
}
else
{
loadAction();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
而在你看來有這個代碼的地方。
<ComboBox ItemsSource="{Binding First.Items}" SelectedItem="{Binding First.SelectedItem}" />
<ComboBox ItemsSource="{Binding Second.Items}" SelectedItem="{Binding Second.SelectedItem}" />
<ComboBox ItemsSource="{Binding Third.Items}" SelectedItem="{Binding Third.SelectedItem}" />
您可以重構,使之更好,使用MVVM框架或專門推導出ItemListViewModel物品的清單,並在有負載的更好的封裝。隨你便。
如果任何父組合框值發生變化,則所有子列表都將被清除。
HTH
相關問題
- 1. 使用MVVM
- 2. 使用MVVM
- 3. 在MVVM中使用SQL命令MVVM
- 4. 使用MVVM/MVVM-Light編輯記錄
- 5. BusyIndicator使用MVVM
- 6. 同時使用MVVM
- 7. 如何使用MVVM
- 8. 使用DataTable的MVVM?
- 9. 使用MVVM與CollectionViewSource
- 10. 使用MVVM搜索
- 11. MVVM和StructureMap使用
- 12. 如何使用MVVM
- 13. 如何使用MVVM
- 14. 使用MVVM模式
- 15. 使用MVVM在XAML中禁用TelerikGrid中的行使用MVVM
- 16. 如何使用MVVM從DataGrid中獲取SelectedItems使用MVVM
- 17. 使用MVVM的Infragistics Excel導出功能使用MVVM
- 18. 使用MVVM隱藏Silverlight DataGrid
- 19. 使用Icenium的Kendo UI MVVM
- 20. Xamarin MVVM使用文件
- 21. WPF無法使用MVVM
- 22. 使用MVVM Light中的ViewModels?
- 23. 在MVVM中使用命令
- 24. 獲取將selectedItem使用MVVM
- 25. 如何強制使用MVVM
- 26. 如何使用MVVM光
- 27. 在WPF MVVM使用XML
- 28. 如何使用TreeViewDragDropTarget MVVM
- 29. 的FlowDocument/RichTextBox的使用MVVM
- 30. MVVM和iOS使用情況
我知道這個答案是舊的 - 但SelectedItem綁定應該是雙向的。並感謝這個有用的例子 – Raziel 2014-12-05 12:37:37
在WPF TwoWay應該是默認的。 Silverlight可能是一個不同的故事,但明確可以幫助任何一種方式。 – aqwert 2014-12-05 22:18:50
解釋它 - 默認情況下Silverlight具有OneWay。有多混亂。 – Raziel 2014-12-06 15:40:47