Элементы в ObservableCollection не обновляют представление

Я здесь в тупике. У меня есть наблюдаемая коллекция, в которой хранятся бизнес-объекты. Я привязал его к ItemsSource ListBox. Я обновляю X и Y своего объекта, и он правильно отображается в пользовательском интерфейсе во время выполнения, поскольку он привязан к элементам сверху и слева. Но вот в чем проблема. Я также привязал некоторые данные для отображения в текстовом свойстве текстового блока, и данные отображают только начальное значение. Он никогда не обновляет текст текстового блока, сколько бы раз я его не менял.

Вот XAML. Если вы заметили проблему с XAML, дайте мне знать. Как я уже сказал, привязка X / Y - Top / Left работает нормально и обновляется при изменении, а TextBlock, привязанный к DisplayData, - нет.

Кроме того, мой бизнес-объект в моей коллекции реализует INotifyPropertyChanged.

Я постараюсь сделать небольшую демонстрацию, чтобы воспроизвести это, если нельзя дать ответ, просто взглянув на XAML.

<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="614" Width="674">

<ListBox Name="PlottingBox" Background="White">

    <ListBox.ItemTemplate>

        <DataTemplate>

            <TextBlock Text="{Binding Path=DisplayData}" />

        </DataTemplate>

    </ListBox.ItemTemplate>

    <ListBox.Template>

        <ControlTemplate TargetType="{x:Type ListBox}">

            <Border Background="{TemplateBinding Background}"

                BorderBrush="{TemplateBinding BorderBrush}"

                BorderThickness="{TemplateBinding BorderThickness}">

                <Canvas IsItemsHost="True" />

            </Border>

        </ControlTemplate>

    </ListBox.Template>

    <ListBox.ItemContainerStyle>

        <Style TargetType="{x:Type ListBoxItem}">

            <Setter Property="Canvas.Left" Value="{Binding Path=PlotX}" />

            <Setter Property="Canvas.Top" Value="{Binding Path=PlotY}" />

         </Style>

    </ListBox.ItemContainerStyle>

</ListBox>


person Doug    schedule 31.08.2009    source источник


Ответы (3)


Я думаю, что проблема в коде. Ваш XAML абсолютно легален и хорошо выглядит. Но перед публикацией исходного кода убедитесь, что выполняются следующие условия:

  1. Ваш бизнес-объект реализует интерфейс INotifyPropertyChanged , и вы вызываете событие PropertyChanged каждый раз, когда значение DisplayData изменяется.

  2. Опечаток нет. Ни в определении свойства DipslayData, ни в PropertyChangedEventArgs, где вы передаете имя свойства «DispayData».

  3. DataContext ListBoxItem относится к типу вашего бизнес-объекта. Проверьте это с помощью Snoop.

  4. Ошибок привязки во время выполнения нет. Запустите приложение в режиме отладки и проверьте окно вывода. Вы также можете проверить это с помощью Snoop.

Надеюсь, после заполнения этого контрольного списка вы получите ответ.

Ваше здоровье :)

person Anvaka    schedule 31.08.2009
comment
Anvaka, Спасибо, что посмотрели на это. 1. Да. 2. Проверил и ОК. 3. Еще не проверял. 4. Нет ошибок привязки. Я создал небольшое приложение, чтобы воспроизвести эту ситуацию, и оно отлично работает. Так что вы абсолютно правы, это ДОЛЖНО быть в моем коде. Я поищу код и доложу. Еще раз спасибо. - person Doug; 01.09.2009
comment
Анвака, ты был прав. Проблема была в моем коде. ГЛУПОЙ, ГЛУПОЙ проблема. Я никогда не обновлял DisplayData после Sub New. DOH! Извините, если я зря потратил ваше время. Дуг - person Doug; 01.09.2009
comment
Рад, что ты нашел ответ :). Поздравляю! - person Anvaka; 01.09.2009

Ваши бизнес-объекты должны реализовывать интерфейс INotifyPropertyChanged, чтобы пользовательский интерфейс был уведомлен об изменении и мог обновляться для отражения нового значения.

person Thomas Levesque    schedule 31.08.2009
comment
Да, это так, я сказал об этом выше. - person Doug; 01.09.2009

Хм, DataContext внутри ListBox - это элемент списка ItemsSource.

например, если ListBox привязан к ObservableCollection, DataContext внутри ListBox будет объектом Person, а не родительским контекстом данных.

Если у вас есть TextBlock с привязкой, привязка будет указывать на объект Person, другими словами, на personInstance.DisplayData, а не на parentDC.DisplayData.

Я не знаю поведения без ItemsSource.

Может быть, вы это знаете, но, может быть, это вам поможет.

person Jesus Rodriguez    schedule 31.08.2009