У меня есть сетка данных (назовем ее dat1), в которой источник элементов привязан к наблюдаемой коллекции пользовательского типа, назовем ее TypeA. Одно из свойств TypeA — это наблюдаемая коллекция другого пользовательского типа, назовем его TypeB. Затем у меня есть поле со списком с источником элементов, привязанным к SelectedItem.TypeB dat1.
Поэтому, когда пользователь выбирает TypeA в dat1, в поле со списком отображаются элементы наблюдаемой коллекции TypeB из выбранного TypeA. Есть смысл?
Привязка ДЕЙСТВИТЕЛЬНО работает и ДЕЙСТВИТЕЛЬНО обновляется. Проблема заключается в том, что когда презентатор элементов в поле со списком уже отображал элементы, а пользователь выбирает другой тип A в dat1 и пытается просмотреть новые элементы в поле со списком, возникает длительная пауза, в то время как презентатор элементов создает новые элементы.
Чтобы проверить проблему, я могу упростить сценарий.
Действия по воспроизведению:
Создайте новый проект WPF с помощью .NET 4.0.
Вырежьте и вставьте код ниже.
Чтобы получить поведение замораживания, вы должны перетащить поле со списком, чтобы увидеть элементы, затем нажать кнопку, чтобы изменить источник элементов, а затем снова удалить поле со списком. Поле со списком падает через несколько секунд, но почему так медленно?
XAML
<Window x:Class="ComboBoxTest.MainWindow"
xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<ComboBox x:Name="cbo" DisplayMemberPath="Junk1"></ComboBox>
<Button Content="Click Me!" Click="btn_Click"></Button>
</StackPanel>
</Grid>
</Window>
Код
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.cbo.ItemsSource = junk1;
}
ObservableCollection<Junk> junk1 = new ObservableCollection<Junk>() {
new Junk() { Junk1 = "junk1 - 1" },
new Junk() { Junk1 = "junk1 - 2" } };
ObservableCollection<Junk> junk2 = new ObservableCollection<Junk>() {
new Junk() { Junk1 = "junk2 - 1" },
new Junk() { Junk1 = "junk2 - 2" },
new Junk() { Junk1 = "junk2 - 3" },
new Junk() { Junk1 = "junk2 - 4" } };
private void btn_Click(object sender, RoutedEventArgs e)
{
if (this.cbo.ItemsSource == junk1)
this.cbo.ItemsSource = junk2;
else
this.cbo.ItemsSource = junk1;
}
}
public class Junk
{
public string Junk1 { get; set; }
}
ПРИМЕЧАНИЕ. Это проблема WPF. Я слышал, что в Silverlight такой проблемы нет. Мне не нужно знать, работает ли Silverlight. Мне нужен ответ WPF.
PS. Задержка больше, когда источник элементов изменяется на мусор2, предположительно, потому, что он больше.
Это настолько задерживает, что я думаю, что это может быть вызвано привязкой исключений, поскольку исключения требуют времени. Есть ли способ узнать, возникают ли исключения привязки?