【问题标题】:Communication between 2 ListBoxes in WPFWPF中2个ListBox之间的通信
【发布时间】:2012-04-25 16:40:42
【问题描述】:

我想为商店构建一个 WPF 后端应用程序。一个视图应该包含 2 个列表框。 1 表示可以购买的物品,1 表示类别。

我想根据选择将项目变灰。现在更多细节:

到目前为止,我的视图模型有一个 ObservableCollection<ShopItem>ShopItem 类有一个pricetitle 和一个list of Categories

我想将 ShopItems 绑定到 1 ListBox 并将 Distinct Category 绑定到另一个 ListBox 由于ShopItem 可以有多个类别,我想将属于选定ShopItem 的所有其他categories 变灰。所以我的第一个listbox 中的选择应该控制我的第二个listbox 的外观。

另一方面,当我选择category 时,我想将除属于该categoryShopItems 之外的所有其他ShopItems 灰显。所以listbox 2 也应该影响listbox 1 的外观。

“变灰”是指项目应该有另一种风格。

我看到了一些关于 MultiTrigger 的东西,它可以根据条件更换模板样式。 我不确定我是否可以绑定我的ObservableCollection<ShopItem> 或者需要在这里有两个列表。我是否需要两个列表之间的一些发布/订阅。我想避免在每次选择更改时遍历视图模型中的所有元素,这里有什么想法吗? 我现在正在摸索如何解决这个问题。任何建议都会很棒...

【问题讨论】:

    标签: wpf mvvm viewmodel publish-subscribe


    【解决方案1】:

    我不确定您是否可以通过迭代集合来将列表更改为灰色,然后列表中的每个项目都必须通知更改。以下是您如何做到这一点的示例。在有IsSelected 的地方,你可以定义一个ValueConverter 来改变字体颜色。

    class ViewModel : ViewModelBase
    {
        //displayed on the first list
        public ObservableCollection<ShopItemViewModel> Shops { get; private set; }
    
        //displayed on the second list
        public ObservableCollection<CategoryViewModel> AllCategories { get; private set; }
    
        //when the user clicks an item on the first list
        private ShopItemViewModel _selectedShop;
        public ShopItemViewModel SelectedShop
        {
            get { return _selectedShop; }
            set
            {
                _selectedShop = value;
                RaisePropertyChanged("SelectedShop");
                foreach (CategoryViewModel cat in AllCategories)
                    cat.Refresh();
            }
        }
    
        //when the user clicks an item on the second list
        private CategoryViewModel _selectedCat;
        public CategoryViewModel SelectedCategory
        {
            get { return _selectedCat; }
            set
            {
                _selectedCat = value;
                RaisePropertyChanged("SelectedCategory");
                foreach (ShopItemViewModel shops in Shops)
                    shops.Refresh();
            }
        }
    }
    
    class ShopItemViewModel : ViewModelBase
    {
        public ObservableCollection<CategoryViewModel> Categories { get; private set; }
    
        public ShopItemViewModel(ViewModel vm)
        {
            _vm = vm;
        }
        private ViewModel _vm;
    
        public void Refresh()
        {
            RaisePropertyChanged("IsSelected");
        }
    
        public bool IsSelected
        {
            get
            {
                if (_vm.SelectedCategory != null)
                {
                    return Categories.Contains(_vm.SelectedCategory);
                }
                return true;
            }
        }
    }
    
    class CategoryViewModel : ViewModelBase
    {
        public CategoryViewModel(ViewModel vm)
        {
            _vm = vm;
        }
        private ViewModel _vm;
    
        public string Title { get; set; }
    
        public void Refresh()
        {
            RaisePropertyChanged("IsSelected");
        }
    
        public bool IsSelected
        {
            get
            {
                if (_vm.SelectedShop != null)
                {
                    return _vm.SelectedShop.Categories.Contains(this);
                }
                return false;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 2014-11-14
      • 2017-12-15
      • 1970-01-01
      相关资源
      最近更新 更多