2012-04-25 32 views
2

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

我想基于选择灰化项目。现在,更多的细节:

到目前为止,我的视图模型具有ObservableCollection<ShopItem> 和类ShopItempricetitlelist of Categories

我要绑定和鲜明Category到另一个第二ListBox 由于ShopItem可以包含多个类别,因此我想将属于所选ShopItem的所有其他categories灰色除外。所以在我的第一个listbox选择应该控制我的第二listbox appereance。

另外一边,当我选择一个category我想变灰属于该category的那些身边所有其他ShopItems。所以再次listbox 2应该也影响listbox 1.

上诉“灰色”我的意思是项目应该有另一种风格。

我看到了一些关于MultiTrigger的东西,它可以根据条件换出模板样式。 我不确定我是否可以绑定我的ObservableCollection<ShopItem>或需要在这里列出两个列表。我是否需要两个列表之间的一些pub/sub。我想避免对viewmodel中的所有元素进行foreach每个选择的更改,这里有什么想法? 我抓我的脑袋现在如何解决这个问题。任何建议将是伟大的...

回答

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; 
     } 
    } 
}