Ошибка связанного списка WPF при отображении 2 элементов

В моем окне есть список WPF. В событии загрузки окна я создаю список (объектов) и добавляю несколько элементов. При запуске или отладке приложения я вижу элементы. Если я добавляю 1 элемент в список, я правильно вижу только 1 элемент. Если я добавляю 3 или более элементов, я правильно вижу 3 или более элементов. Если я добавлю только 2 элемента, я увижу только 1 элемент. Почему?

Вот мой код WPF

<Window x:Class="Cacatua.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Cacatua;assembly=" >

    <Grid>
        <ListBox Name="lbSearch" ItemsSource="{Binding}" />
    </Grid>
</Window>

А вот мой код программной части (та же сборка в пространстве имен Cacatua):

Private myLstSearch As List(Of Object)

Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
     myLstSearch = New List(Of Object)
     lbSearch.ItemsSource = myLstSearch
     Dim myMedia1 as Media1

     myMedia1 = New Media1("IdMedia1-A")
     myLstSearch.Add(myMedia1)

     myMedia1 = New Media1("IdMedia1-B")
     myLstSearch.Add(myMedia1)
End Sub

где Media1 - простой класс, содержащий строку

Public Class Media1
    Private myIdTitolo As String
    Public ReadOnly Property IDTitolo As String
        Get
            Return (myIdTitolo)
        End Get
    End Property
    Public Sub New(str As String)
        myIdTitolo = str
    End Sub
End Class

С помощью этого кода я бы увидел список с этим выводом (нет таблички с данными): Cacatua.Media1 Cacatua.Media1

но вижу только Cacatua.Media1

Думаю, это ошибка. Но я первый с этой проблемой?


person Erminio Ottone    schedule 29.07.2014    source источник
comment
Попробуйте установить свой ItemsSource после того, как заполните список, и посмотрите, имеет ли это значение. Кроме того, вам не нужно одновременно связывать свойство ItemsSource в XAML и устанавливать его в коде программной части. Используйте только одно или другое :)   -  person Rachel    schedule 29.07.2014
comment
Спасибо, Рэйчел, ошибка была: привязка пустого списка. Я не знаю почему, но в событии Loaded, если привязка выполняется ПОСЛЕ добавления списка, я также вижу только 2 элемента! Загадочно, но с другим номером, чем 2, он работает ...   -  person Erminio Ottone    schedule 29.07.2014
comment
Мое лучшее предположение - это проблема времени, хотя я не уверен, будет ли это между тем, когда ItemsControl был отрисован, когда был установлен ItemsSource, или когда он попытался проанализировать (недопустимую) привязку.   -  person Rachel    schedule 29.07.2014
comment
Это ужасное ограничение списка WPF, и обходной путь для разрешения этого ограничения - ужасный оверкод ... но у меня нет альтернатив! Еще раз спасибо, Рэйчел!   -  person Erminio Ottone    schedule 29.07.2014


Ответы (1)


Вы правильно поняли, но проблема в том, что ваш ItemsSource не знает, когда обновлять, поскольку вы не используете ObservableCollection. Также существует проблема синхронизации между рендерингом и загрузкой окна, и я думаю, что это связано с тем, что вы не привязываете свой источник элементов должным образом.

Для начала попробуйте изменить тип myLstSearch на ObservableCollection(Of Media1).

Кроме того, лучший способ сделать это - напрямую привязать его к XAML, чтобы ваш код программной части был примерно таким:

Public property MyListSearch As ObservableCollection(Of Media1)

Тогда ваш XAML будет выглядеть так:

<Window x:Class="Cacatua.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Cacatua;assembly=">

    <Grid>
        <ListBox Name="lbSearch" ItemsSource="{Binding Path=MyListSearch}" />
    </Grid>
</Window>

Таким образом, вы можете просто инициализировать MyListSearch в конструкторе окна, а затем добавлять в него элементы всякий раз, когда ваше представление будет обновляться автоматически.

person Forest Kunecke    schedule 29.07.2014