我有一个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>
我没有在输出窗格中获得有关绑定是对还是错的任何信息。我无法弄清楚我做错了什么。
只是为了增加乐趣,我在另一个页面上有相同的连接,它完全打破了绑定。行甚至都没有显示。
我的问题是:
答案 0 :(得分:1)
如果这条线可能导致您的问题:
_memberList = new ObservableCollection<Member>(_backingMemberList);
通过你覆盖字段(_memberList)的东西的外观,这可能是你的属性MemberList ...用不同的对象实例...但Binding可能是指最初创建的那个.... 。(代码的前半部分中的_memberList是一个实例....然后在代码的末尾设置一个新实例)...是的,你正在创建_backingMemberList的浅表副本...但是你已更改_memberList ...并需要告诉Binding使用集合的新实例。
您需要执行OnPropertyChanged("MemberList")
告诉它您更改了属性....或者只是不要执行“新”...因为您已经通过执行{已将项添加到集合中在你的foreach中{1}}和Clear()
。
还回到你解释为什么你正在做你正在做的事情......你可能会考虑采用不同的方式过滤你的收藏。
当Add()
绑定到集合时,您可以在CollectionViewSource
上使用由WPF生成的过滤器,而不是制作副本。它位于ItemsSource
和ObservableCollection
之间。