0

CompositeCollection を使用して元の ItemsSource を追加のオブジェクトと「マージ」する ComboBox から派生したカスタム コントロールがあります。

問題はそれです

CompositeCollection comp = new CompositeCollection();
SomeLogic();
ItemsSource = comp;

構成された Collection に ItemsSource を設定すると、SelectedItem が null に設定され、ViewModel への Binding TwoWay Binding が呼び出されます。ViewModel の SelectedItem バインド プロパティは「null」になります。

現在、ItemsSource を割り当てた後に SelectedItem を復元することで、これを回避しています。

 Object priorSelectedItem = SelectedItem;
 ItemsSource = comp;    
 SelectedItem = priorSelectedItem;

ただし、これは ViewModel の SelectedItem の値を修正するだけです。厄介な副作用は、オブジェクトが変更されたときに、いくつかのロジックがセッターで実行されることです。EGセッティングa

_dataHasChanged = true; 

国旗。

だから何か方法があれば

a)ItemsSourceの変更中にSelectedItemがリセットされるのを防ぎます

また

b) ItemsSource の変更中に SelectedItem-Binding が呼び出されないようにする

カスタムコントロール内から(コントロールに欠陥があるため、20個のViewModelを処理したくありません)その方法についてのご意見をお待ちしております:-)

4

1 に答える 1

0

SelectedItem-Binding を OnApplyTemplate() のプライベート変数に保存し、それをクリアして、新しい ItemsSource が適用された後に変数値に戻すことで、この動作を防ぐことができました。

    private Binding _selectedItemBinding;
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        _selectedItemBinding = BindingOperations.GetBinding(this, ComboBox.SelectedItemProperty);
        BindingOperations.ClearBinding(this, ComboBox.SelectedItemProperty);
        if (BindingOperations.IsDataBound(this, ComboBox.SelectedItemProperty))
            this.SetBinding(ComboBox.SelectedItemProperty, "dummy");
        ...
    }

 private void AdaptItemSource()
 {
   Object priorSelectedItem = SelectedItem;
   ItemsSource = comp;    
   SelectedItem = priorSelectedItem;

   BindingOperations.SetBinding(this, ComboBox.SelectedItemProperty, _selectedItemBinding);
 }

これは私にとってトリックでした

于 2012-11-16T12:37:21.263 に答える