0

我有一个绑定到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. 如果做不到这一点,我该如何调试数据绑定?
4

1 回答 1

1

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

_memberList = new ObservableCollection<Member>(_backingMemberList);

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

你需要做一个OnPropertyChanged("MemberList")告诉它你改变了属性......或者只是不做“新”......因为你已经通过做Clear()Add()在你的foreach中将项目添加到集合中。


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

当您绑定到集合时,您可以使用CollectionViewSourceWPF 生成的过滤器,而不是制作副本。ItemsSource它位于您的ObservableCollectionDataGrid.

于 2012-08-11T20:19:30.947 回答