0

私は現在 ICollectionView で遊んでいますが、「なぜ」は理解していると思うが、「どうすれば修正できるのか」という問題に直面しています。:)

ICollectionView にデータバインドされた ComboBox があり、最初は次のコードで設定されています。

NameView = CollectionViewSource.GetDefaultView( names); // names is an IEnumerable<string> that comes from a LINQ query
NameView.CurrentChanged += new EventHandler(NameView_CurrentChanged);

IEnumerable<string>新しいものを生成し、上記と同じコードで NameView を再度設定するコードを実行するまで、すべてがうまく機能します。これを行うと、CurrentItem正しく機能しなくなります。

ComboBoxes にデータバインドする前にこの問題に遭遇しました。プロパティを newに設定する代わりにandObservableCollection<string>を使用して、「バインド解除」の問題を回避します。Clear()Add()ObservableCollection<string>ObservableCollection<string>

私の質問は次のとおりです。 1. プロパティを新しいコレクションに設定できるようにしたい場合は、どうにかして新しいコレクションとのデータバインディングを再確立できますか? もしそうなら、どのように?そうでない場合、これが根本的に不可能である理由の背後にある WPFisms を説明できますか? ObservableCollection<string>2.またはの変更に対処する最善の方法は何ICollectionViewですか? クリアして追加するだけの私のアプローチは、それを行う唯一の方法ですか?

4

1 に答える 1

1

WPFコントロールをICollectionViewsにバインドすると(XAMLがInitializeComponent-callで解析されるときに発生します-バインドはXAMLで実際に定義する必要があります!)、コントロールはコレクションによって公開された必要なイベント(CollectionChangedなど)をサブスクライブします。

コレクションプロパティは、メモリアドレスへの単なる参照です。これを新しいコレクション(つまり、新しいアドレス)に曲げると、DataBindingは気づきません。元のコレクションが「IAmOuttaHere」のようなものを公開することは期待できません。明らかに、コントロールは「私は新しい男です」という新しいコレクションをリッスンしません。しかし、これが正しく表示された場合、スニペットはCurrentChangedにイベントハンドラーを追加するだけです(コンボボックス内の他のアイテムが選択されているときに監視することを意味します)

バインドは通知がすべてであるため、コレクションが交換されたことをコントロールに通知しない限り、最初のコレクションに固執します。次のようにINotifyPropertyChangedを実装してみてください。

    public class ViewModel : INotifyPropertyChanged
{
    private ICollectionView myCollection;

    public ICollectionView MyCollection
    {
        get
        {
            return this.myCollection;
        }
        set
        {
            this.myCollection = value;
            this.OnPropertyChanged("MyCollection");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public void ExchangeCollection()
    {
        this.MyCollection = new CollectionView(....)
    }

}

MyCollectionに対してバインドを行う必要があります。個人的には、ICollectionViewsを自分で定義することはしませんが、たとえば、気の利いたIListのように操作するのはあまり良くなく、バインディングが定義されるとすぐにコレクションに自動的にラップされます。

お役に立てれば

セビ

于 2010-09-24T07:59:51.127 に答える