Combobox SelectedItem не обновляется при изменении источника - PullRequest
8 голосов
/ 17 августа 2010

У меня есть модель представления, которая реализует INotifyPropertyChanged.В этом viewModel это свойство с именем SubGroupingView.Это свойство привязано к выбранному элементу поля со списком.Когда я изменяю поле со списком, свойство источника корректно обновляется, но когда я изменяю свойство источника или когда инициализируется элемент управления, combobox.selectedItem НЕ отражает то, что существует в свойстве.
Вот некоторый код дляНачало работы:

<ComboBox Grid.Column="3" Grid.Row="1" 
          Margin="0,1,4,1" 
          SelectedItem="{Binding Path=SubGroupingView, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, diag:PresentationTraceSources.TraceLevel=High}" 
          ItemsSource="{Binding Columns}" 
          DisplayMemberPath="DisplayName">

Свойство вызывает событие PropertyChanged, и вывод TraceSource показывает мне, что привязка обнаружила его и передала значение, просто комбинированный список не отражает его.Любые идеи будут приветствоваться!

РЕДАКТИРОВАТЬ:
вывод из источника трассировки это:

System.Windows.Data Warning: 91 : BindingExpression (hash=23631369): Got PropertyChanged event from ReportViewModel (hash=52844413)  
System.Windows.Data Warning: 97 : BindingExpression (hash=23631369): GetValue at level 0 from ReportViewModel (hash=52844413) using RuntimePropertyInfo(SubGroupingView):         DataColumnViewModel (hash=58231222)  
System.Windows.Data Warning: 76 : BindingExpression (hash=23631369): TransferValue - got raw value DataColumnViewModel (hash=58231222)  
System.Windows.Data Warning: 80 : BindingExpression (hash=23631369): TransferValue - implicit converter produced DataColumnViewModel (hash=58231222)  
System.Windows.Data Warning: 85 : BindingExpression (hash=23631369): TransferValue - using final value DataColumnViewModel (hash=58231222)  

Вот код для свойства источника:

public class ReportViewModel : ViewModelBase, IReportTemplate
{
    public DataColumnViewModel SubGroupingView
    {
        get
        {
            return GetViewModel(_report.SubGrouping);
        }
        set
        {
            if (_report.SubGrouping == value.ColumnName)
                return;
            _report.SubGrouping = value.ColumnName;
            RefreshDataSeries();
            base.OnPropertyChanged("SubGroupingView");
            base.OnPropertyChanged("IsReady");
        }

    }
}

Примечание: ViewModelBase реализует INotifyPropertyChange.

ОТВЕТ
Я перегрузил операторы ==,! =, GetHashCode() и Equals(object) и теперь этоработает хорошо.Спасибо за вашу помощь!

Ответы [ 3 ]

16 голосов
/ 20 августа 2010

Объект, возвращаемый из вашего SubGroupingView, должен быть «равен» одному из объектов в ComboBox.Items (что означает, что он должен находиться в вашей коллекции Columns).Поэтому, если вы выполните «a.Equals (b)», оно должно будет вернуть true.

Если они функционально одинаковы, но не возвращают true при сравнении, то это ваша проблема.Вам нужно будет либо вернуть тот же объект, либо переопределить метод Equals (и, возможно, операторы == и! =).

Если это ваша проблема, это та же проблема, что и в этом вопросе .

3 голосов
/ 17 августа 2010

Возможно, IsSynchronizedWithCurrentItem на вашем ComboBox установлено на false? Вы можете явно установить IsSynchronizedWithCurrentItem="True" и посмотреть, поможет ли это.

0 голосов
/ 26 июля 2016

Ответ @CodeNaked правильный. Но в моем случае просто переопределение Object.Equals создает исключение StackOverflowException. Я думаю, что весь ответ заключается в реализации полного IEquatable, что означает реализацию его метода Equals и переопределение методов Object.Equals (Object) и Object.GetHashCode, как в этот пример (см. Конец раздела «Замечания» Примечания для разработчиков "- и раздел" Примеры ".

...