2012-08-11 142 views
0

我有一個ObservableCollection綁定到DataGrid,一切工作正常。我想過濾集合而不必重複訪問數據庫,因此我決定使用後備集合來存儲原始列表,然後公開地將過濾的列表公開給綁定。所以,我有以下代碼:綁定到ObservableCollection的副本

_backingMemberList.Clear(); 
_memberList.Clear(); 

foreach (Member CurrentMember in ListOfMembers) 
{ 
    _memberList.Add(CurrentMember); 
    _backingMemberList.Add(CurrentMember); 
} 

_memberList = new ObservableCollection<Member>(_backingMemberList); 

,並且綁定是簡單的:

<DataGrid Name="dataGridMembers" ItemsSource="{Binding MemberList}" /> 

現在,由於某種原因,這打破了RowStyle

<DataGrid.RowStyle> 
    <Style TargetType="DataGridRow"> 
     <Setter Property="Background"> 
      <Setter.Value> 
       <SolidColorBrush Color="{Binding BindsDirectlyToSource=True, Converter={StaticResource BGColor}}"/>         
      </Setter.Value> 
     </Setter> 
    </Style> 
</DataGrid.RowStyle> 

我沒有得到任何信息在輸出窗格中關於綁定是對還是錯。我無法弄清楚我做錯了什麼。

只是爲了增加樂趣,我在其他頁面上獲得了相同的連接,並完全打破了綁定。行甚至不顯示。

我的問題是:

  1. 我在做什麼錯?
  2. 失敗的是,我該如何調試數據綁定?
+0

所以一切,如果您刪除'RowStyle'作品? – 2012-08-11 21:05:39

+0

不行,如果我使用後備集合,RowStyle不起作用。如果我使用原始的ObservableCollection,RowStyle可以正常工作。但無論如何,轉換器都能正常工作。 – 2012-08-11 22:43:46

回答

1

如果可能是這條線,是造成你的問題:

_memberList = new ObservableCollection<Member>(_backingMemberList); 

的事情要覆蓋這大概是使用你的財產會員領域(_memberList)看起來...用不同的對象實例...但綁定可能是指最初創建的一個.....(您的_memberList在代碼的前半部分是一個實例....然後在代碼的末尾設置一個新實例)...是的,你正在創建一個_backingMemberList的淺表副本...但是你已經改變_memberList ...並且需要告訴Binding使用集合的新實例。

你需要做一個OnPropertyChanged("MemberList")來告訴它你改變了屬性....或者只是不要做「新」...因爲你已經通過添加Clear()Add()你的foreach。


也回到你的解釋你爲什麼在做你在做什麼...你可能會考慮一種不同的方式來過濾你的收藏。

您可以使用CollectionViewSource上的過濾器來取代WPF在將ItemsSource綁定到集合時生成的過濾器。它位於您的ObservableCollectionDataGrid之間。

+0

該行不覆蓋後臺字段,它使用後備集合的「淺」副本初始化新集合。 至於使用CollectionViewSource,我發現它比製作備份集合更麻煩......除非支持收集的想法不起作用。 :) – 2012-08-11 20:47:52

+0

好吧,我嘗試使用CollectionViewSource並無法讓它工作。但是當我瀏覽數據網格時,數據顯示出來了。這是我停止嘗試使用它的主要原因。 – 2012-08-11 22:32:28

+0

您是否試圖擺脫「新」聲明或解僱OnPropertyChanged? – 2012-08-11 22:44:29

相關問題