【问题标题】:Need a simple Example of cascading combo boxes using MVVM需要一个使用 MVVM 级联组合框的简单示例
【发布时间】:2010-09-09 13:41:32
【问题描述】:

需要一个使用 MVVM 级联组合框的简单示例

Wpf / Silverlight

【问题讨论】:

    标签: wpf silverlight mvvm


    【解决方案1】:

    如果我理解您的问题,您希望下一个组合框根据之前的值填充数据。

    我有一个通用的 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));
            }
        }
    }
    

    然后拥有将绑定到视图的 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

    【讨论】:

    • 我知道这个答案是旧的 - 但 SelectedItem 绑定应该是双向的。感谢这个有用的例子
    • 在 WPF 中 TwoWay 应该是默认值。 Silverlight 可能是一个不同的故事,但明确可以帮助任何一种方式。
    • 这就解释了——Silverlight 默认有 OneWay。多么令人困惑。
    • Silverlight 是一个子集(删除了一些有时很烦人的功能),所以我猜为了速度和效率,他们默认放弃了双向绑定。
    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    相关资源
    最近更新 更多