2015-10-28 35 views
1

我希望Insert將項目分成ObservableCollection,它在調度程序線程上使用ComboBox綁定(通過使用DispatcherTimer確保)。如果在ComboBox中選擇了一個項目,則插入調用將導致應用程序崩潰,並顯示不可調試Win32Exception(看起來像this)。當該項目是Add而不是Insert ed時,代碼將按預期運行。在ObservableCollection上插入導致Win32Exception

最少的代碼示例:

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

} 

是否有插入的項目,而不會導致應用程序崩潰的方法嗎?

+0

當您嘗試「觸摸」所選項目時,似乎會出現問題 - 插入使用Array.Copy,因此所選項目被複制,然後在舊索引處替換爲新項目,這可能不是由組合框操縱。請注意,當您在0位置選擇項目,然後在第一個索引處插入項目時,不會有任何例外。 – Romasz

+0

在插入之前保留選中的項目並將其設置爲'null'似乎有效(這在我需要在數據綁定屬性實現中處理這種情況時很有用)。隨意添加答案:) – Gene

回答

1

這個問題似乎是,一旦你嘗試「觸摸」選擇的項目出現 - 的ObservableCollection使用List.Insert方法,正如你可以看到在reference使用Array.Copy。選定的項目被複制,然後用舊的索引替換爲新項目,這可能不是由Combobox所致,並導致異常。

請注意,當您在0位置選擇項目,然後在第一個索引處插入項目時,不會有任何例外。類似的 - 如果沒有選擇項目,插入任何位置都不會有例外。因此,作爲一種解決方法,如果適用,您可以嘗試設置Combobox.Selected項目到null開始插入之前,什麼可以工作。