Combobox SelectedItem n'est pas mise à jour lors de la modification de la source d'
J'ai un viewmodel qui mettent en œuvre INotifyPropertyChanged
. Sur ce viewModel est une propriété appelée SubGroupingView
. Cette propriété est liée à l'élément sélectionné d'une liste déroulante. Lorsque je change la zone de liste déroulante de la propriété source est mis à jour correctement, mais lorsque je change la source de la propriété ou lorsque le contrôle est initialisé, le combobox.selectedItem
ne reflète PAS ce qui existe dans la propriété.
Voici un peu de code pour vous aider à démarrer:
<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 propriété soulève la PropertyChanged
événement et le TraceSource sortie me montre que la liaison détecté et a transféré la valeur, c'est juste que la zone de liste déroulante n'est pas le refléter. Toute idée est la bienvenue!
EDIT:
sortie à partir de la trace de la source est: est-ce
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)
Voici le code de la propriété source:
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");
}
}
}
Remarque: ViewModelBase
implémente INotifyPropertyChange
.
RÉPONSE
J'ai surchargé l' ==, != les opérateurs, GetHashCode()
, et Equals(object)
et maintenant il fonctionne parfaitement. Merci à tous pour votre aide!
R u me traque matt? pas de chance, il y
Intéressant... pourriez-vous éventuellement poster un extrait de votre ViewModel (plus précisément la définition de SubGroupingView)?
Attaché à modifier
Comment voulez-vous modifier la source de la propriété? Est-ce vraiment l'objet de la liste, pas une copie?
OriginalL'auteur TerrorAustralis | 2010-08-17
Vous devez vous connecter pour publier un commentaire.
L'objet retourné à partir de votre SubGroupingView doit être "l'égalité" à l'un des objets dans la zone de liste déroulante.Les éléments (ce qui signifie qu'il doit être dans votre collection de Colonnes). Donc, si vous effectuez un "un.Equals(b)", il aurait besoin de retourner la valeur true.
Si ils sont fonctionnellement le même, mais pas de retourner true quand par rapport à votre problème. Vous devez retourner le même objet, ou de remplacer la méthode Equals (et potentiellement l' == et != les opérateurs).
Si c'est votre question, c'est le même problème que dans ce question.
Il est difficile de dire avec certitude, puisque chaque situation est différente. Si vous êtes ViewModel n'est pas utilisé dans ItemsControls, alors il ne peut pas d'importance si vous substituez des Égaux. Mais vous devez exécuter dans la même situation si vous avez une simple Liste<MyViewModel>.Contient du(de quelque chose). Depuis les Contient, effectuer un test d'égalité aussi.
OriginalL'auteur CodeNaked
Est
IsSynchronizedWithCurrentItem
sur votreComboBox
peut-être mis àfalse
? Vous pourriez essayer de définir explicitementIsSynchronizedWithCurrentItem="True"
et voir si cela aide.Cela m'a aidé lors de la mise à jour de la liste des points et l'indice choisi est resté le même.
Si je l'ai mis, j'ai "impossible d'assigner à la propriété 'de Windows.L'INTERFACE utilisateur.Xaml.Les contrôles.Primitives.Sélecteur.IsSynchronizedWithCurrentItem'." au cours de l'initialiser (C'est un UWP application, la propriété a été suggéré par Intellisense, donc il existe)
OriginalL'auteur Zach Johnson
L' @CodeNaked 's réponse est juste. Mais dans mon cas, juste primordial de l'Objet.Est égal à jette StackOverflowException. Je pense que la solution est la mise en œuvre complète IEquatable que signifie la mise en œuvre de sa méthode Equals et dominante de l'Objet.Equals(Object) et de l'Objet.GetHashCode méthodes comme dans cet exemple (voir la fin de "Remarques" de la section "Billets de maîtres d'œuvre" et section "Exemples").
OriginalL'auteur Alex34758