2010-08-17 15 views
8

Tengo un modelo de vista que implementa INotifyPropertyChanged. En este viewModel es una propiedad llamada SubGroupingView. Esta propiedad está vinculada al elemento seleccionado de un cuadro combinado. Cuando cambio el cuadro combinado, la propiedad de origen se está actualizando correctamente, pero cuando cambio la propiedad de origen o cuando se inicializa el control, el combobox.selectedItem NO refleja lo que existe en la propiedad.
Aquí hay un código para que pueda empezar:Combobox SelectedItem no se actualiza cuando la fuente cambia

<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"> 

La propiedad genera el evento PropertyChanged y la salida TraceSource me muestra que la unión detectada y transfiere el valor, es sólo que el cuadro combinado no está reflejarla . ¡Cualquier idea seria muy bienvenida!

EDIT:
salida desde el origen de seguimiento es la siguiente:

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) 

Aquí es el código de la propiedad de origen:

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"); 
     } 

    } 
} 

Nota: ViewModelBase implementa INotifyPropertyChange.

RESPUESTA
que sobrecarga el ==,! = Operadores, GetHashCode(), y Equals(object) y ahora se está trabajando muy bien. ¡Gracias por toda tu ayuda!

+0

Fuera de interés, intente configurar el ItemsSource antes del SelectedItem en su declaración XAML allí. –

+0

¿Me estás acosando? no hay suerte allí – TerrorAustralis

+0

Interesante ... ¿podría publicar un fragmento de su ViewModel (específicamente la definición de SubGroupingView)? – Pwninstein

Respuesta

15

El objeto devuelto por su SubGroupingView debe ser "igual" a uno de los objetos en el ComboBox.Items (lo que significa que debe estar en su colección Columns). Por lo tanto, si realiza un "a.Equals (b)", debería volver verdadero.

Si son funcionalmente iguales, pero no son verdaderas en comparación, ese es su problema. Debería devolver el mismo objeto o anular el método Equals (y potencialmente los operadores == y! =).

Si este es su problema, es el mismo problema que en este question.

+0

¡BIEN vale la recompensa! ¡Te votaría aún más si pudiera! ¿Qué implicaciones tiene esto para MVVM? ¿Deberían todas las VM de MVVM implementar un comparador en la clase base? (No puede otorgar recompensa por otras tres horas) – TerrorAustralis

+0

Es difícil decirlo definitivamente, ya que cada situación es diferente. Si usted es ViewMod el no se usa en ItemsControls, entonces puede no importar si anulas Equals. Pero se encontraría en la misma situación si hiciera una simple lista .Contiene (algo). Dado que los Contains también están realizando una prueba de igualdad. – CodeNaked

3

¿Es IsSynchronizedWithCurrentItem en su ComboBox quizás establecido en false? Podría intentar establecer explícitamente IsSynchronizedWithCurrentItem="True" y ver si eso ayuda.

+0

Gracias amigo, pero no tuve suerte, si configuro IsSynchronizedWithCurrentItem, no se dispara del setter en la fuente – TerrorAustralis

+1

Esto me ayudó a actualizar el la lista de elementos y el índice seleccionado permanecen igual. – Dave

+0

Si lo configuro, obtengo "No se pudo asignar a la propiedad" Windows.UI.Xaml.Controls.Primitives.Selector.IsSynchronizedWithCurrentItem '. "durante la inicialización (Es una aplicación UWP, la propiedad fue sugerida por Intellisense, por lo que existe) –

0

La respuesta de @CodeNaked es correcta. Pero en mi caso simplemente anulando Object.Equals arroja StackOverflowException. Creo que toda la respuesta es implementar IEquatable completo que significa implementar su método Equals y reemplazar los métodos Object.Equals (Object) y Object.GetHashCode como en this example (ver el final de la sección "Comentarios" - "Notas para los implementadores" - y " Ejemplos "sección").

Cuestiones relacionadas