2012-09-21 43 views
0

我有一個ListBox和一個DataGrid,DataGrid顯示供應商提供的價格報價,而ListBox顯示供應商列表。我想要實現的是在供應商列表中選中/取消選中供應商,並過濾DataGrid,這樣DataGrid將只顯示在列表框中選中的供應商的報價單。使用ListBox來過濾Datagrid

我現在面臨的難點,

我有供應商的唯一列表

class Supplier 
{ 
    bool IsChecked {get; set;} 
    Person Supplier {get; set;} 

} 

ObservableCollections<Supplier> SupplierList; 

我有報價的列表

class Quote 
{ 
    double Price {get; set;} 
    Supplier Supplier{get; set;} 
    Quote(double price, Supplier supplier) 
    { 
     Price = price; 
     Supplier = supplier; 
    } 
} 

ObservableCollections<Quote> QuoteList; 

QuoteList是綁定到數據網格,而SupplierList綁定到ListBox。

當我在列表框中選中/取消選中供應商列表時,是否可以同時更改報價中的供應商?以及如何實現這一目標?

+0

''SupplierList'中的項目和'QuoteList'中引用的'Supplier'實例是相同的實例嗎?如果不是,可以檢查兩個供應商實例的等價性嗎? – Dennis

+0

@Dennis您好,我其實喜歡讓它們成爲同一個實例,但是當我使用SupplierList中的Supplier實例在QuoteList中構造Quote時,它會被複制並且不再共享相同的IsChecked屬性。我如何設計我的課程使他們成爲同一個實例? – tesla1060

+0

請顯示'報價單'結構代碼。 – Dennis

回答

0

在這種情況下,您不需要生成一個ObservableCollection,您不會鎖定擁有物理列表而不是查詢。

我建議你引入一個SupplierQuoteQuery類(參見MVVM pattern瞭解更多關於ViewModel的信息)來支持這個視圖,它需要實現INotifyPropertyChanged,以便你可以告訴你什麼時候你的過濾列表發生了變化。

當您的IsChecked更改時,您需要以某種方式通知SupplierQuoteQuery類,並且應該導致爲PropertyChanged調用新的Property FilteredQuotes。

public IEnumerable<Quote> FilteredQuotes { get { 
    return from x in Quotes where x.Supplier.IsChecked select x; } }