Элементы в ObservableCollection, не обновляющие представление - PullRequest
2 голосов
/ 01 сентября 2009

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

Вот XAML. Если вы видите проблему с XAML, пожалуйста, дайте мне знать. Как я уже сказал, привязка X / Y - верх / левый работает нормально и обновляется при изменении, а 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 ]

5 голосов
/ 01 сентября 2009

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

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

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

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

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

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

Приветствия:)

1 голос
/ 01 сентября 2009

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

0 голосов
/ 01 сентября 2009

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

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

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

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

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

...