2012-04-25 30 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; 
     } 
    } 
}