首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入ObservableCollection导致Win32Exception

插入ObservableCollection导致Win32Exception
EN

Stack Overflow用户
提问于 2015-10-28 11:33:43
回答 1查看 328关注 0票数 1

我希望将一个项目绑定到一个Insert中,这个ObservableCollection使用调度程序线程上的ComboBox绑定(通过使用DispatcherTimer来确保)。插入调用将导致应用程序与不可调试的Win32Exception (类似于)崩溃,如果在ComboBox中选择了项。当项目是Added而不是Inserted时,代码将按预期运行。

最小代码示例:

代码语言:javascript
复制
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <ComboBox x:Name="comboBox" HorizontalAlignment="Left" Margin="77,59,0,0" VerticalAlignment="Top" Width="120"
              ItemsSource="{Binding Data}">

        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Text}" />
            </DataTemplate>
        </ComboBox.ItemTemplate>

    </ComboBox>

    <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="202,58,0,0" VerticalAlignment="Top" Click="button_Click"/>

</Grid>

</Page>

而背后的密码是:

代码语言:javascript
复制
public class MyData
{
    public string Text { get; set; }
}

public sealed partial class MainPage : Page
{
    public ObservableCollection<MyData> Data { get; set; }

    public MainPage()
    {
        DataContext = this;

        Data = new ObservableCollection<MyData>()
        {
            new MyData { Text = "Lorem" }
        };

        this.InitializeComponent();
    }

    private void button_Click(object sender, RoutedEventArgs e)
    {
        var timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(1);
        timer.Tick += (_, __) => { Data.Insert(0, new MyData { Text = "Ipsum" }); /* crash */ };
        timer.Start();
    }

}

有没有一种方法可以插入该项目而不会导致应用程序崩溃?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-28 12:18:00

当您尝试“触摸”选定的项时,问题似乎就会发生-- ObservableCollection使用List.Insert方法,正如您在参考文献上看到的那样,它使用Array.Copy。所选项目将被复制,然后在旧索引处替换为新项,这可能不会由Combobox处理,从而导致异常。

请注意,当您在0位置选择item,然后在第一个索引处插入item时,也不会有例外。相似--如果没有选择任何项目,在任何位置插入时都不会有例外情况。因此,作为一种解决方法,如果可以应用,可以尝试在开始插入之前将Combobox.Selected项设置为null。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33389957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档