gpt4 book ai didi

wpf - WPF 中两个 ListBox 之间的通信

转载 作者:行者123 更新时间:2023-12-03 10:19:44 25 4
gpt4 key购买 nike

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

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

到目前为止,我的 View 模型有一个 ObservableCollection<ShopItem>和类(class)ShopItem有一个 price , titlelist of Categories
我要绑定(bind)ShopItems至 1 ListBox和独特的Category到第二个 ListBox由于 ShopItem可以有多个类别 我想将所有其他 categories 灰显在属于 Selected ShopItem 的旁边.所以在我的第一个listbox中选择应该控制我的第二个 listbox 的外观.

另一方面,当我选择 category我想将所有其他 ShopItems 变灰除了属于那个category .再说一次listbox 2 也会影响 listbox 中的外观1.

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

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

最佳答案

我不确定您是否可以通过迭代集合来将列表更改为灰色,然后列表中的每个项目都必须通知更改。以下是您如何做到这一点的示例。哪里有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;
}
}
}

关于wpf - WPF 中两个 ListBox 之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10320054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com