2010-08-17 2 views
8

У меня есть модель, которая реализует INotifyPropertyChanged. В этом представленииModel является свойством, называемым SubGroupingView. Это свойство привязано к выбранному элементу поля со списком. Когда я меняю поле со списком, свойство source обновляется нормально, но когда я изменяю свойство источника или когда инициализируется элемент управления, combobox.selectedItem НЕ отражает то, что существует в свойстве.
Вот код, чтобы вы начали: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 показывает мне, что связывание обнаружен его и передал значение, его только что выпадающий не отражает его , Любые идеи были бы очень желанными!

EDIT:
выход из источника трассировки заключается в следующем:

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), и теперь он работает хорошо. Спасибо за всю твою помощь!

+0

Из интереса попробуйте установить ItemsSource перед SelectedItem в вашем заявлении XAML. –

+0

R u преследует меня матовым? нет удачи там – TerrorAustralis

+0

Интересный ... вы могли бы опубликовать фрагмент вашего ViewModel (в частности, определение SubGroupingView)? – Pwninstein

ответ

15

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

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

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

+0

ХОРОШО стоить щедрость! Я бы проголосовал за вас еще дальше, если бы мог! Каковы последствия этого для MVVM? должны ли все MVVM VM реализовать компаратор в базовом классе? (не может получить награду за еще три часа) – TerrorAustralis

+0

Трудно сказать окончательно, поскольку каждая ситуация другая. Если вы ViewMod el не используется в ItemsControls, тогда не имеет значения, переопределите ли вы Equals. Но вы попадаете в ту же сатуру, если бы сделали простой список . Содержит (что-то). Так как Contains также выполняет тест равенства. – CodeNaked

3

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

+0

Спасибо, но не повезло, если я установил IsSynchronizedWithCurrentItem, он не запускает сеттер на источнике – TerrorAustralis

+1

Это помогло мне при обновлении список элементов и выбранный индекс остались прежними. – Dave

+0

Если я его установил, я получаю «Не удалось назначить свойство» Windows.UI.Xaml.Controls.Primitives.Selector.IsSynchronizedWithCurrentItem «.» во время инициализации (это приложение UWP, свойство было предложено Intellisense, поэтому оно существует) –

0

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

Смежные вопросы