微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

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

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

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

有人有任何想法吗?

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

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

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

解决方法

找到一个解决方法原因以前的解决方案没有解决我的问题.

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

代码如下:

myComboBox.ItemsSource = myList;
await Task.Delay(100);
myComboBox.Selectedindex = 12;

希望这可以帮助 !

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


原文地址:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx 原文发布日期: 9/19/2005 原文已经被 Microsoft 删除了,收集过程中发现很多文章图都不全,那是因为原文的图都不全,所以特收集完整全文。 目录 前言 CLR启动程序
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采纳和使用,它的确提供了很多的优势也解决了很多的问题,但是我们也知道也并不是银弹,提供优势的同时它也给我们的开发人员和团队也带来了很多的挑战。 为了迎接或者采用这些新技术,开发团队需要更加注重一些流程或工具的使用,这样才能更好的适应这些新技术所
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下PLINQ中的分区。上一篇介绍了并行编程,这边详细介绍一下并行编程中的分区和自定义分区。 先做个假设,假设我们有一个200Mb的文本文件需要读取,怎么样才能做到最优的速度呢?对,很显然就是拆分,把文本文件拆分成很多个小文件,充分利用我们计算机中
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Microsoft为了利用这个硬件特性,于是在Visual Studio 2010 和 .NET Framework 4的发布及以上版本中,添加了并行编程这个新特性,我想它以后势必会改变我们的开发方式。 在以前或者说现在,我们在并行开发的时候可
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么
c语言怎么求字符串的长度并输出
c语言函数的三种调用方式是什么
c语言中保留两位小数怎么表示
double的输入格式符是什么