C# · 12月 23, 2021

c# – 通用应用程序 – 加载组合框’ItemsSource async会产生奇怪的行为

在使用通用应用程序(目前仅在WP8.1方面)时,我偶然发现了以下奇怪的事情.

我有一个Combo@R_539_2419@,其中的UserControl(位于WindowsPhone项目中)绑定到共享项目中的VM. ItemsSource和SelectedItem都绑定到VM中各自的属性.

运行应用程序时,当您选择除第一个项目之外的任何项目时,它都可以正常运行.但是,当我选择第一个项目时,Combo@R_539_2419@中显示的字符串显示了.ToString() – VM的方法而不是……

(顺便说一句,这是一个简单的List< string&gt ;,所选项目是一个字符串.它不能比那简单得多:p) 我创建了一个示例应用程序,其中只包含此Combo@R_539_2419@和VM.我能够重现这一点,我异步填写绑定到ItemsSource的属性的那一刻.从同步方法执行时,它可以工作.但是从异步方法填充它只会产生上述问题. 一些截图: 第一个显示应用程序何时加载.集合更改时,将选择列表的第一个元素.它显示在这里: 当您单击Combo@R_539_2419@时,您可以像往常一样查看其项目:
假设你点击第一个以外的任何元素,你仍然会得到正常的行为:

到目前为止,这是正常的.现在单击第一个项目.你得到这个:

我尝试了各种各样的事情,比如把它作为一个对象的列表,而不仅仅是字符串.将转换器添加到绑定对象,仅用于调试目的,仅显示实际的字符串值.我不知道绑定的SelectedItem如何以及为什么突然显示Combo@R_539_2419@的DataContext …

您可以在此处下载示例应用:
http://1drv.ms/1DhklCQ
(不包含二进制文件,只包含代码)

有人有任何想法吗?

编辑:重现此问题所需的代码:

创建一个空白的通用商店应用程序(8.1).
在WindowsPhone项目中,MainPage.xaml文件:
我添加了一个简单的组合框,并捕获Loaded事件.

<Combo@R_539_2419@ ItemsSource=”{Binding Items}” SelectedItem=”{Binding SelectedItem}” />

在它的代码背后.我已将DataContext分配给VM.在Loaded事件中,我异步调用VM.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();}

VM对象定义如下:

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)); } }}解决方法 找到一个解决方法原因以前的解决方案没有解决我的问题.

只需在绑定和选择组合框的项目或索引之间添加一个暂停.

代码如下:

myCombo@R_539_2419@.ItemsSource = myList;await Task.Delay(100);myCombo@R_539_2419@.SelectedIndex = 12;

希望这可以帮助 !