2012-08-11 4 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'? –

+0

Нет, RowStyle не работает, если я использую коллекцию поддержки. RowStyle отлично работает, если я использую оригинальный ObservableCollection. Но конвертеры прекрасно работают в любом случае. –

ответ

1

Если может быть эта линия, которая вызывает у вас проблемы:

_memberList = new ObservableCollection<Member>(_backingMemberList); 

взглядами вещей, которые вы перезаписать поле (_memberList), который предположительно используемый вашим собственности ... Пользователи с другой экземпляр объекта ... но привязка, вероятно, относится к первоначально созданному ..... (ваш _memberList в первой половине кода является одним экземпляром .... а затем в конце кода вы устанавливаете новый экземпляр) ... да, вы создаете неглубокую копию _backingMemberList ... однако вы изменили _memberList ... и должны сообщить Binding использовать новый экземпляр коллекции.

Вам необходимо сделать OnPropertyChanged("MemberList"), чтобы сообщить, что вы изменили свойство .... ИЛИ просто не делаете «новый» ... поскольку вы уже добавили предметы в коллекцию, выполнив Clear() и Add() в ваш предлог.


Также возвращаясь к вашему объяснению того, почему вы делаете то, что вы делаете ... Вы могли бы рассмотреть другой способ фильтрации коллекции.

Вместо того чтобы сделать копию, вы можете использовать Фильтр на CollectionViewSource, который генерируется WPF, когда ваш ItemsSource привязан к коллекции. Он находится между вашим ObservableCollection и DataGrid.

+0

Эта строка не перезаписывает фоновое поле, оно инициализирует новую коллекцию «неглубокой» копией резервной коллекции. Что касается использования CollectionViewSource, я считаю его более раздражающим, чем создание резервной коллекции ... если, конечно, идея коллекции поддержки не работает. :) –

+0

ОК, я попытался использовать CollectionViewSource и не смог заставить его работать. НО, когда я Snoop datagrid, тогда данные появляются. Это основная причина, по которой я перестала пытаться ее использовать. –

+0

Вы пытались избавиться от «нового» заявления или уволили OnPropertyChanged? –

Смежные вопросы