WPF MVVM ComboBox SelectedItem oder SelectedValue funktioniert nicht
Update
Nach ein bisschen Untersuchung. Was scheint zu sein, das Problem ist, dass die SelectedValue - /SelectedItem ist, der vor das Element source ist fertig geladen. Wenn ich sitzen in einer Pause, und warten Sie einige Sekunden, funktioniert es wie erwartet. Weiß nicht, wie ich werde, um dies zu umgehen.
End Update
Ich habe eine Anwendung in WPF mit MVVM mit einer ComboBox. Unten ist die ViewModel-Beispiel. Das Problem das ich habe ist, wenn wir unsere Seite verlassen und Wandern zurück die ComboBox ist nicht die Auswahl den aktuellen Wert ausgewählt ist.
View-Modell
public class MyViewModel
{
private MyObject _selectedObject;
private Collection<Object2> _objects;
private IModel _model;
public MyViewModel(IModel model)
{
_model = model;
_objects = _model.GetObjects();
}
public Collection<MyObject> Objects
{
get
{
return _objects;
}
private set
{
_objects = value;
}
}
public MyObject SelectedObject
{
get
{
return _selectedObject;
}
set
{
_selectedObject = value;
}
}
}
Gründen der diesem Beispiel, sagen wir MyObject hat die beiden Eigenschaften (Text und Id). Mein XAML-Code für die ComboBox sieht wie folgt aus.
XAML
<ComboBox Name="MyComboBox" Height="23" Width="auto"
SelectedItem="{Binding Path=SelectedObject,Mode=TwoWay}"
ItemsSource="{Binding Objects}"
DisplayMemberPath="Text"
SelectedValuePath="Id">
Egal wie ich konfigurieren, wenn ich kommen Sie zurück zu der Seite, und das Objekt ist wieder die ComboBox wird nicht wählen Sie den Wert aus. Das Objekt ist wieder das richtige Objekt über das erhalten in das Eigentum obwohl.
Ich bin mir nicht sicher, ob dies nur ein Problem mit der Art und Weise der ComboBox und MVVM-pattern funktioniert. Das Textfeld binden wir tun, richtig funktioniert.
InformationsquelleAutor der Frage cjibo | 2009-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie versucht, die Umsetzung
INotifyPropertyChanged
in der viewmodel, und heben Sie dann diePropertyChanged
- Ereignis, wenn derSelectedItem
gestellt bekommt?Wenn diese selbst nicht beheben, dann werden Sie in der Lage sein, um manuell erhöhen
PropertyChanged
Veranstaltung selbst bei der Navigation zurück zu der Seite, und das sollte genug sein, um WPF, selbst aktualisieren und zeigen Sie das richtige Element ausgewählt.InformationsquelleAutor der Antwort Orion Edwards
Einstellung
IsSynchronizedWithCurrentItem="True"
für mich gearbeitet!InformationsquelleAutor der Antwort rp7799
Müssen Sie legen Sie die ItemsSource-Eigenschaft, BEVOR Sie die SelectedItem-Eigenschaft. Ich stolperte über einen blog vor ein paar Tagen zu erwähnen, das Problem.
InformationsquelleAutor der Antwort GuestPerson
Ich habe ähnliche Probleme, und es wurde gelöst, indem Sie sicher, ich war die Implementierung IEquatable richtig. Wenn die Bindung erfolgt, wird es versuchen, um zu sehen, wenn die Objekte übereinstimmen, so stellen Sie sicher, dass Sie richtig Umsetzung Ihrer Gleichheit prüfen.
InformationsquelleAutor der Antwort
In diesem Fall, die selecteditem binden funktioniert nicht, weil die hash-id der Objekte sind Verschieden.
Eine mögliche Lösung ist:
Basierend auf dem ausgewählten Element-id, wiederherstellen Sie das Objekt an die itemsource-Sammlung und legen Sie die ausgewählte item-Eigenschaft.
Beispiel:
Eigentum gebunden zu ItemSource ist:
Eigentum gebunden zu SelectedItem ist:
Den recovery-code:
Ich hoffe es hilft dir.
Ich verbrachte viel von meiner Zeit auf der Suche nach Antworten, aber ich konnte Sie nicht finden.
InformationsquelleAutor der Antwort Breno P. Lucena
Beim verlassen der aktuellen Seite, die
CollectionView
im Zusammenhang mit derItemsSource
Eigenschaft desComboBox
bereinigt wird. Und weil dieComboBox
IsSyncronizedWithCurrent
Eigenschaft ist standardmäßig true, dieSelectedItem
undSelectedValue
Eigenschaften zurückgesetzt werden.Dies scheint eine interne Datentyp-Problem in der Bindung. Wie andere oben, wenn Sie verwenden
SelectedValue
statt durch die Bindung an eine int-property im viewmodel, es wird funktionieren.Eine Verknüpfung für Sie wäre, um das überschreiben der
Equals
Betreiber auf MyObject, so dass beim Vergleich von zwei MyObjects, die tatsächlicheId
Eigenschaften verglichen werden.Noch ein Tipp: Wenn Sie die Umstrukturierung Ihrer viewmodels und verwenden
SelectedValue
verwenden Sie es nur, wennSelectedValuePath=Id
woId
istint
. Wenn Sie mit einem string-Schlüssel, binden an dieText
Eigenschaft desComboBox
stattSelectedValue
.InformationsquelleAutor der Antwort Dave
Habe ich bemerkt, dass dieses Verhalten sowohl vor als auch. Ich habe bemerkt, dass der SelectedIndex-Eigenschaft nicht dazu führen, dass der gleiche Fehler. Wenn Sie neu strukturieren kann, Ihr ViewModel setzen Sie den index des ausgewählten Elements, und binden sich an Sie, dass Sie sollten gut zu gehen.
InformationsquelleAutor der Antwort Abe Heidebrecht
Ich hatte das gleiche problem. Die Sache ist die. Das ausgewählte Element nicht wissen, welches Objekt Sie verwenden soll, aus der Sammlung. So haben Sie zu sagen, um das ausgewählte Element zu verwenden, das Element aus der Auflistung.
Ich hoffe, das hilft.
InformationsquelleAutor der Antwort StefanHa
Habe ich eine ganz einfach Antwort für dieses problem. Zuerst fügen Sie den folgenden code, um die Ansicht IsSynchronizedWithCurrentItem="True".
Weiter, wenn überhaupt vergeben Sie ein neues Objekt in das ViewModel zu, dass die Eigenschaft SelectedObject gespeichert werden soll, die Eigenschaft und nicht die privaten member.
Viewmodel Proptery sollte wie folgt Aussehen
Dies sollte das Problem beheben.
InformationsquelleAutor der Antwort Tim
Kämpfte ich mit diesem Thema für eine Weile. In meinem Fall war ich mit in der Komplex-Typ (Liste) als das Element Source und wurde mit einem KeyType als der gewählte Wert. Auf dem load-Ereignis, das KeyType-war immer auf null gesetzt. Dies führte alles zu brechen. Keines der sub-Elemente aktualisiert würde, wenn der Schlüssel geändert. Es stellte sich heraus, dass, wenn ich Hinzugefügt, stellen Sie sicher, dass der vorgeschlagene Wert für KeyType war nicht null ist, funktioniert alles wie erwartet.
InformationsquelleAutor der Antwort Scott McFadden
Den Typ des
SelectedValuePath
und dieSelectedValue
muss GENAU gleich sein.Wenn zum Beispiel die Art des
SelectedValuePath
istInt16
und den Typ der Eigenschaft, der anSelectedValue
istint
wird es nicht funktionieren.Ich Stunden damit verbringen, zu finden, und das ist, warum beantworte ich hier nach so viel Zeit die Frage, die gestellt wurde. Vielleicht ein armer Mann wie mich mit dem gleichen problem, kann es sehen.
InformationsquelleAutor der Antwort Dummy01
Ich hatte dieses problem mit einer ComboBox zeigt eine Liste von Farben ( Liste<Pinsel> ).
Die Auswahl einer Farbe möglich war, aber es war nicht angezeigt, wenn die Auswahl geschlossen (obwohl die Eigenschaft wurde geändert!)
Das Update war das überschreiben der Equals(object obj) - Methode für die Typ-Auswahl in der ComboBox (Pinsel), das war nicht einfach, weil Pinsel versiegelt.
Also schrieb ich eine Klasse EqualityBrush mit einer Bürste und Implementierung von Equals:
Mithilfe einer Liste von meinen neuen EqualityBrush-Klasse anstelle der normalen Bürste-Klasse das problem behoben!
Meine Combobox XAML sieht wie folgt aus:
Erinnere mich, dass mein "Pinsel"-Eigenschaft in der ViewModel jetzt hat der Typ EqualityBrush!
InformationsquelleAutor der Antwort JCH2k
Könnte es die Art und Weise Sie die Anwendung des DataContext auf die Seite. In WPF, jedes mal, wenn Sie navigieren Sie zu einer Seite wird alles neu initialisiert, Konstruktor aufgerufen wird, geladen Methoden, alles. wenn Sie also die Einstellung Ihres DataContext in Ihrem Blick ohne Zweifel werden Sie weggeblasen, dass SelectedItem, die der Benutzer ausgewählt. Um zu vermeiden, dass die KeepAlive-Eigenschaft Ihrer Seiten.
Dies wird im Ergebnis nur das Loaded-Ereignis wird ausgelöst, wenn die Navigation wieder auf eine Seite, die Sie bereits besucht haben. So werden Sie brauchen, um sicherzustellen, dass Sie den DataContext auf Initialisieren (entweder extern oder innerhalb des Konstruktors) eher als Belastung.
Allerdings funktioniert das nur für diese Instanz von der Seite. Wenn Sie navigieren Sie zu einer neuen Instanz der Seite Konstruktor erneut aufgerufen werden.
InformationsquelleAutor der Antwort markti
ComboBox.SelectionBoxItem.ToString()
InformationsquelleAutor der Antwort Sean Campbell
IsSyncronizedWithCurrent=False gesetzt ist, wird es funktionieren.
InformationsquelleAutor der Antwort Rohit
Verwenden Loaded-Ereignis:
Es funktioniert für mich.
InformationsquelleAutor der Antwort Vinicius
Ich das problem gelöst, durch hinzufügen dispatcher in UserControl_Loaded Veranstaltung
InformationsquelleAutor der Antwort Peter T.