我希望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();
}
}
是否有插入的項目,而不會導致應用程序崩潰的方法嗎?
當您嘗試「觸摸」所選項目時,似乎會出現問題 - 插入使用Array.Copy,因此所選項目被複制,然後在舊索引處替換爲新項目,這可能不是由組合框操縱。請注意,當您在0位置選擇項目,然後在第一個索引處插入項目時,不會有任何例外。 – Romasz
在插入之前保留選中的項目並將其設置爲'null'似乎有效(這在我需要在數據綁定屬性實現中處理這種情況時很有用)。隨意添加答案:) – Gene