在ObservableCollection上插入会导致Win32Exception

时间:2015-10-28 11:33:43

标签: c# windows-10 uwp

我希望将Insert项添加到ObservableCollection中,该ComboBox使用调度程序线程上的DispatcherTimer进行绑定(使用Win32Exception确保)。如果在ComboBox中选择了某个项目,则插入调用将导致应用程序因不可调试的Add(看起来像this)而崩溃。当项目Insert而不是<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> 时,代码将按预期运行。

最小代码示例:

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

}

背后的代码:

config = [722 722 723 723 721];
lenght=[3 4 5 6 7];
a=eye(3);b=ones(3);c=magic(3);
d1 = kron( ~rem(config, 721).*lenght, a);
d2 = kron( ~rem(config, 722).*lenght, b);
d3 = kron( ~rem(config, 723).*lenght, c);
result = d1 + d2 + d3;

有没有办法插入项目而不会导致应用程序崩溃?

1 个答案:

答案 0 :(得分:1)

一旦您尝试“触摸”所选项目,似乎就会出现问题 - ObservableCollection 使用 List.Insert 方法,正如您在reference所看到的那样使用 Array.Copy 。复制所选项目,然后在旧索引处替换为新项目,这可能不是由 Combobox 进行处理并导致异常。

请注意,当您在0位置选择项目然后在第一个索引处插入项目时,将不会有异常。类似 - 如果没有选择任何项目,在任何位置插入时都不会有异常。因此,作为一种变通方法,如果适用,您可以尝试在开始插入之前将 Combobox.Selected 项设置为 null ,这可能有用。