2012-08-11 113 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

相关问题