绑定到ObservableCollection的副本

时间:2012-08-11 19:42:26

标签: wpf data-binding observablecollection

我有一个ObservableCollection绑定到DataGrid,一切正常。我希望过滤集合而不必反复访问数据库,因此我决定使用后备集合来存储原始列表,然后公开将过滤后的列表公开给绑定。所以我有以下代码:

_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. 如果不这样做,我该如何调试数据绑定?

1 个答案:

答案 0 :(得分:1)

如果这条线可能导致您的问题:

_memberList = new ObservableCollection<Member>(_backingMemberList);

通过你覆盖字段(_memberList)的东西的外观,这可能是你的属性MemberList ...用不同的对象实例...但Binding可能是指最初创建的那个.... 。(代码的前半部分中的_memberList是一个实例....然后在代码的末尾设置一个新实例)...是的,你正在创建_backingMemberList的浅表副本...但是你已更改_memberList ...并需要告诉Binding使用集合的新实例。

您需要执行OnPropertyChanged("MemberList")告诉它您更改了属性....或者只是不要执行“新”...因为您已经通过执行{已将项添加到集合中在你的foreach中{1}}和Clear()


还回到你解释为什么你正在做你正在做的事情......你可能会考虑采用不同的方式过滤你的收藏。

Add()绑定到集合时,您可以在CollectionViewSource上使用由WPF生成的过滤器,而不是制作副本。它位于ItemsSourceObservableCollection之间。