1

現在選択されているエンティティの PropertyChanged イベントをサブスクライブするのは悪い習慣ですか。List にバインドされたグリッドがあり、Grid の SelectedItem を ViewModel の SelectedItem プロパティにバインドしたとします。

private Customer _selectedItem;
public Customer SelectedItem
{
    get {return _selectedItem;}
    set
    {
        if (!ReferenceEquals(_selectedItem, value))
        {
            _selectedItem = value;
            RaisePropertyChanged(()=>SeletedItem);
            _selectedItem.PropertyChanged += OnCustomerPropertyChanged;
        }
    }
}

このコードには、パフォーマンスに関して、メモリ リークに関して何らかの欠点がありますか?それとも、このように使用しても安全ですか?

4

1 に答える 1

3

イベント サブスクリプションをリークしています。SelectedItem にバインドするという考え方に問題はありませんが、後で登録を解除することを忘れないでください。また、サブスクライブおよびサブスクライブ解除する前に、値を null チェックする必要があります。

private Customer _selectedItem;
public Customer SelectedItem
{
    get {return _selectedItem;}
    set
    {
        if (!ReferenceEquals(_selectedItem, value))
        {
            if (!ReferenceEquals(null, _selectedItem))
                _selectedItem.PropertyChanged -= OnCustomerPropertyChanged;
            _selectedItem = value;
            RaisePropertyChanged(()=>SelectedItem);
            if (!ReferenceEquals(null, _selectedItem))
                _selectedItem.PropertyChanged += OnCustomerPropertyChanged;
        }
    }
}

そうしないと、項目を次々と選択していくと、以前に選択したすべての項目の PropertyChanged イベント ハンドラーが にフックされOnCustomerPropertyChangedます。その結果、メモリ リークが発生したり (イベント ハンドラーによって、イベントを発生させたオブジェクトが GC されるのを防ぐことができるため)、または予期しない動作が発生する可能性があります。

于 2012-06-23T18:22:23.687 に答える