2

ショップ用の WPF バックエンド アプリを構築したいと考えています。また、1 つのビューには 2 つのリストボックスが含まれている必要があります。1 つは購入できるアイテム、1 つはカテゴリです。

選択に基づいてアイテムをグレーアウトしたい。詳細:

これまでのところ、私のビュー モデルには があり、ObservableCollection<ShopItem> クラスShopItemには があります。pricetitlelist of Categories

ShopItems1 にバインドしListBox、 DistinctCategoryを別の 2ndにバインドしたいa は複数のカテゴリを持つことができるListBox ので、 Selected に属するカテゴリの横にあるShopItem他のすべてをグレー表示にしたいと考えています。したがって、最初の選択で2 番目の外観を制御する必要があります。categoriesShopItemlistboxlistbox

一方、 を選択すると、それに属するものの横にあるcategory他のすべてをグレーアウトしたいと思います。したがって、2 も 1 の外観に影響するはずです。ShopItemscategorylistboxlistbox

「グレーアウト」とは、アイテムに別のスタイルが必要であることを意味します。

条件に基づいてテンプレート スタイリングを交換できる MultiTrigger について何かを見ました。バインドできるかどうか、ObservableCollection<ShopItem>またはここに 2 つのリストが必要かどうかはわかりません。2 つのリストの間に pub/sub が必要ですか。ビューモデルのすべての要素を選択するたびに foreach を変更することは避けたいのですが、何か考えはありますか? これをどう解決するか、今頭を悩ませています。どんな提案も素晴らしいでしょう...

4

1 に答える 1

0

コレクションを反復処理してリストをグレーアウトに変更すると、リスト内の各項目が変更を通知する必要があるかどうかはわかりません。以下は、その方法の例です。フォントの色を変更IsSelectedするために a を定義できます。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;
        }
    }
}
于 2012-04-25T23:50:28.053 に答える