Während ich an einer Universal App arbeite (derzeit nur auf der WP8.1-Seite), bin ich auf die folgende seltsame Sache gestoßen.Universal App - Loading Combobox 'ItemsSource Async gibt seltsames Verhalten
Ich habe eine ComboBox, das UserControl (befindet sich im WindowsPhone-Projekt) es ist an eine VM im Shared-Projekt gebunden. Sowohl ItemsSource als auch SelectedItem sind mit ihren jeweiligen Eigenschaften in der VM verknüpft.
Wenn Sie die Anwendung ausführen, wenn Sie ein Element außer dem ersten auswählen, funktioniert es perfekt. Aber, wenn ich das erste Element auszuwählen, die angezeigte Zeichenfolge in der ComboBox zeigt die .ToString()
-Methode der VM statt ...
(BTW, es ist eine einfache List<string>
, das ausgewählte Element ist ein string
. Es kann nicht viel einfacher als das: p)
Ich habe eine Beispiel-App erstellt, die nur diese Combobox und die VM enthält. Ich konnte dies reproduzieren, in dem Moment, in dem ich Eigenschaften, die mit ItemsSource verknüpft sind, asynchron ausfülle. Wenn es von einer synchronen Methode aus geschieht, funktioniert es. Aber nur das Füllen von einer asynchronen Methode liefert das obige Problem.
Einige Screenshots:
Die erste zeigt die App, wenn es geladen wird. Wenn sich die Sammlung ändert, wird das erste Element der Liste ausgewählt. Es wird hier gezeigt:
Wenn Sie auf die ComboBox klicken Sie seine Elemente wie gewohnt zu sehen bekommen:
Sagen Sie bitte nicht die erste auf ein beliebiges Element klicken, erhalten Sie noch normales Verhalten:
So weit, so normal. Klicken Sie nun auf den ersten Eintrag. Sie erhalten diese:
...
ich eine Vielzahl von Dingen versucht haben, wie es eine Liste eines Objekts statt nur Strings zu machen. Das Hinzufügen eines Konverters zu den verknüpften Objekten, nur zu Debugging-Zwecken, ergibt nur die tatsächlichen String-Werte. Ich habe keine Ahnung, wie, noch warum die binded SelectedItem zeigt plötzlich die Datacontext des ComboBox ...
Sie die Beispiel-App hier herunterladen können: http://1drv.ms/1DhklCQ (enthält keine Binärdateien, nur der Code)
Hat jemand irgendwelche Ideen?
EDIT: Der Code benötigt, um dieses Problem zu reproduzieren:
Erstellen Sie eine leere Universal-Store App (8.1). Im WindowsPhone-Projekt, die Datei MainPage.xaml: Ich habe eine einfache Combobox hinzugefügt, und fangen Sie das Loaded-Ereignis.
<ComboBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" />
In seinem Code hinter. Ich habe den DataContext der VM zugewiesen. Und im Loaded-Event rufe ich asynchron die VM an.Loaddata()
private VM _vm = new VM();
public MainPage()
{
this.InitializeComponent();
this.DataContext = _vm;
}
private async void Page_Loaded(object sender, RoutedEventArgs e)
{
await _vm.LoadDataAsync();
}
Das VM-Objekt definiert ist wie folgt:
public class VM : INotifyPropertyChanged
{
private List<string> _items;
public List<string> Items
{
get { return _items; }
set
{
_items = value;
_selectedItem = _items.FirstOrDefault();
RaisePropertyChanged("Items");
RaisePropertyChanged("SelectedItem");
}
}
private string _selectedItem;
public string SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
RaisePropertyChanged("SelectedItem");
}
}
public VM()
{
}
public async Task LoadDataAsync()
{
this.Items = new List<string>()
{
"a",
"b",
"c",
"d",
"e",
"f",
};
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
}
Warum postest du den Code hier nicht? – Sajeetharan
Ich habe den Code zum ursprünglichen Post hinzugefügt. –
Für was es wert ist, haben wir auch das gleiche Problem in unserer Anwendung, die viele asynchrone Muster verwendet. Unsere Schlussfolgerung ist, dass es ein Fehler mit der ComboBox ist. –