Wpf 需要一个使用MVVM的级联组合框的简单示例吗
需要一个使用MVVM的级联组合框的简单示例吗Wpf 需要一个使用MVVM的级联组合框的简单示例吗,wpf,silverlight,mvvm,Wpf,Silverlight,Mvvm,需要一个使用MVVM的级联组合框的简单示例吗 Wpf/Silverlight如果我理解您的问题,您希望在下一个组合框中填充基于上一个值的数据 我有一个通用的ViewModel,您可以捕获项目列表和所选项目 class ItemListViewModel<T> : INotifyPropertyChanged where T : class { private T _item; private ObservableCollection<T> _items;
Wpf/Silverlight如果我理解您的问题,您希望在下一个组合框中填充基于上一个值的数据 我有一个通用的ViewModel,您可以捕获项目列表和所选项目
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));
}
}
}
class ItemListViewModel:INotifyPropertyChanged其中T:class
{
私人信托基金项目;
私人可观测收集项目;
public ItemListViewModel()
{
_items=新的ObservableCollection();
_item=null;
}
公共无效集合项(IEnumerable项)
{
项目=新的可观测集合(项目);
SelectedItem=null;
}
公共可观测收集项目
{
获取{return\u items;}
专用设备
{
_项目=价值;
增加财产变更(“项目”);
}
}
公共T选择项
{
获取{return\u item;}
设置
{
_项目=价值;
RaisePropertyChanged(“SelectedItem”);
}
}
公共事件属性更改事件处理程序属性更改;
私有void RaisePropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
}
然后将主viewmodel绑定到视图的DataContext。让加载方法执行您想要的操作
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;
}
类MyViewModel:INotifyPropertyChanged
{
公共MyViewModel()
{
First=新的ItemListViewModel();
第二个=新的ItemListViewModel();
第三个=新的ItemListViewModel();
First.PropertyChanged+=(s,e)=>Update(e.PropertyName,First,Second,LoadSecond);
Second.PropertyChanged+=(s,e)=>Update(e.PropertyName,Second,Third,LoadThird);
LoadFirst();
}
public ItemListViewModel First{get;set;}
public ItemListViewModel第二个{get;set;}
public ItemListViewModel第三个{get;set;}
私有void LoadFirst()
{
第一.集合项目(新的清单{“一”、“二”、“三”});
}
私有void LoadSecond()
{
第二.集合项目(新列表{“第一”、“第二”、“第三”});
}
私有void LoadThird()
{
第三,集合项目(新列表{“第一”、“第二”、“第三”});
}
私有无效更新(字符串propertyName、ItemListViewModel父项、ItemListViewModel子项、Action loadAction)
哪里T0:班级
其中T1:class
{
如果(propertyName==“SelectedItem”)
{
如果(parent.SelectedItem==null)
{
SetItems(Enumerable.Empty());
}
其他的
{
loadAction();
}
}
}
公共事件属性更改事件处理程序属性更改;
}
在你看来,这个代码在什么地方
<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我知道这个答案很古老,但是SelectedItem绑定应该是双向的。感谢这个有用的例子,WPF TwoWay应该是默认的。Silverlight可能是一个不同的故事,但是明确的表达可以帮助任何一种方式。这就解释了为什么Silverlight在默认情况下是单向的。太令人困惑了。Silverlight是一个子集(有些功能被删除了,有时会很烦人),所以我想为了速度和效率,默认情况下他们放弃了双向绑定。