WPF中2个ListBox之间的通信

时间:2012-04-25 16:40:42

标签: wpf mvvm viewmodel publish-subscribe

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

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

到目前为止,我的视图模型有ObservableCollection<ShopItem> 并且班级ShopItempricetitlelist of Categories

我想将ShopItems绑定到1 ListBox,将明确Category绑定到另一个ListBox 由于ShopItem可以包含多个类别,因此我希望将属于所选categories的所有其他ShopItem灰显掉。因此,我的第一个listbox中的选择应该控制我的第二个listbox中的上诉。

另一方面,当我选择category时,我希望将属于该ShopItems的所有其他category变灰。因此,listbox 2也应该影响listbox 1中的吸引力。

“灰显”是指物品应该有另一种风格。

我看到了一些可以根据条件交换模板样式的MultiTrigger。 我不确定我是否可以绑定我的ObservableCollection<ShopItem>或者需要在此处有两个列表。我需要两个列表之间的一些发布/订阅。我想避免对viewmodel中的所有元素进行预测,每个选择都会改变,这里有什么想法吗? 我现在正在摸索如何解决这个问题。任何建议都会很棒......

1 个答案:

答案 0 :(得分:0)

我不确定你是否可以通过迭代集合来将列表更改为灰色,然后列表中的每个项目都必须通知更改。以下是如何执行此操作的示例。如果有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;
        }
    }
}
相关问题