У меня есть сетка данных (назовите ее 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.Задержка больше, когда источник элементов изменяется на junk2, предположительно потому, что он больше.
Это задерживает достаточно, так что я думаю, что это может быть вызвано привязкой исключений, так как исключения занимают время.Есть ли способ увидеть, если выбрасываются исключения привязки?