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

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

Вот 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>

3 ответа

Решение

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

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

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

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

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

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

Ура:)

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

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

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

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

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

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

Другие вопросы по тегам