2

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

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

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

我想绑定ShopItems到 1ListBox和 DistinctCategory到另一个 2ndListBox 因为 aShopItem可以有多个类别,所以我想将categories属于 Selected 的所有其他类别变灰ShopItem。所以我第一次的选择listbox应该控制我第二次的表现listbox

另一方面,当我选择 a 时,category我想将ShopItems属于该 的所有其他都变灰category。所以再次listbox2也应该影响listbox1的外观。

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

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

4

1 回答 1

0

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

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;
        }
    }
}
于 2012-04-25T23:50:28.053 回答