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は1つのインスタンスです....そしてコードの最後に新しいインスタンスを設定します)...はい、_backingMemberListの浅いコピーを作成しています...ただし_memberListを変更しました...そして、コレクションの新しいインスタンスを使用するようにBindingに指示する必要があります。

プロパティを変更したことを通知するためにを実行する必要があります。または、「新規」を実行しないでください。これは、foreachを実行しOnPropertyChanged("MemberList")てコレクションにアイテムをすでに追加しているためです。Clear()Add()


また、自分がやっていることをなぜやっているのかについての説明に戻りましょう...コレクションをフィルタリングする別の方法を検討するかもしれません。

コピーを作成する代わりに、コレクションにバインドされたCollectionViewSourceときにWPFによって生成されるフィルターを使用できます。ItemsSourceそれはあなたObservableCollectionとの間にありますDataGrid

于 2012-08-11T20:19:30.947 に答える