Элементы в 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 абсолютно легален и выглядит хорошо. Но перед публикацией исходного кода убедитесь, что выполняются следующие условия:
Ваш бизнес-объект реализует интерфейс INotifyPropertyChanged, и вы вызываете событие PropertyChanged каждый раз, когда изменяется значение DisplayData.
Там нет опечаток. Ни в определении свойства DipslayData, ни в PropertyChangedEventArgs, где вы передаете имя свойства "DispayData".
DataContext объекта ListBoxItem относится к типу вашего бизнес-объекта. Проверьте это с Snoop.
Нет ошибок привязки во время выполнения. Запустите ваше приложение в режиме отладки и проверьте окно вывода. Вы также можете проверить это с помощью Snoop.
Надеюсь, после заполнения этого контрольного списка у вас будет ответ.
Ура:)
Ваши бизнес-объекты должны реализовать INotifyPropertyChanged
интерфейс, так что пользовательский интерфейс уведомляется об изменении и может обновляться, чтобы отразить новое значение
Хм, DataContext внутри ListBox является элементом списка ItemsSource.
Например, если ваш ListBox связан с ObservableCollection, DataContext внутри ListBox будет объектом Person, а не родительским текстом данных.
Если у вас есть TextBlock с привязкой, привязка будет указывать на объект Person, другими словами, personInstance.DisplayData, а не parentDC.DisplayData.
Я не знаю поведение без ItemsSource.
Может быть, вы знаете это, но, возможно, это поможет вам.