我想为商店构建一个WPF后端应用程序。一个视图应包含2个列表框。 1表示可以购买的物品,1表示类别。
我想根据选择灰显项目。现在更多细节:
到目前为止,我的视图模型有ObservableCollection<ShopItem>
并且班级ShopItem
有price
,title
和list of Categories
我想将ShopItems
绑定到1 ListBox
,将明确Category
绑定到另一个ListBox
由于ShopItem
可以包含多个类别,因此我希望将属于所选categories
的所有其他ShopItem
灰显掉。因此,我的第一个listbox
中的选择应该控制我的第二个listbox
中的上诉。
另一方面,当我选择category
时,我希望将属于该ShopItems
的所有其他category
变灰。因此,listbox
2也应该影响listbox
1中的吸引力。
“灰显”是指物品应该有另一种风格。
我看到了一些可以根据条件交换模板样式的MultiTrigger。
我不确定我是否可以绑定我的ObservableCollection<ShopItem>
或者需要在此处有两个列表。我需要两个列表之间的一些发布/订阅。我想避免对viewmodel中的所有元素进行预测,每个选择都会改变,这里有什么想法吗?
我现在正在摸索如何解决这个问题。任何建议都会很棒......
答案 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;
}
}
}