#c# #wpf #xaml #data-binding
#c# #wpf #xaml #привязка данных
Вопрос:
У меня возникла проблема с привязкой данных к свойству, которое находится на двух уровнях в коллекции.
Объект структурирован таким образом: Коллекция —Данные —Имя —Коллекция —Имя —Данные
Таким образом, по сути, это коллекция внутри коллекции, и я, похоже, не могу привязаться к имени внутри содержащейся коллекции. Я могу привязаться ко всем свойствам исходной коллекции, включая коллекцию внутри нее, но как только я пытаюсь привязаться к свойству name внутренней коллекции, я получаю плохие привязки.
Часть XAML
lt;TabControl ItemsSource="{Binding Path=BMOverlayCollection}" Grid.Column="0" Grid.Row="4" Grid.ColumnSpan="4"gt; lt;TabControl.ItemTemplategt; lt;!-- this is the header template--gt; lt;DataTemplategt; lt;TextBlock Text="{Binding Name}" /gt; lt;/DataTemplategt; lt;/TabControl.ItemTemplategt; lt;TabControl.ContentTemplategt; lt;!-- this is the body of the TabItem template--gt; lt;DataTemplategt; lt;TextBlock Text="{Binding Graphics.Name}" /gt; lt;/DataTemplategt; lt;/TabControl.ContentTemplategt; lt;/TabControlgt;
Часть C#
public class BMGraphicsOverlayCollection : INotifyPropertyChanged, IEnumerable { #region Event Property public event PropertyChangedEventHandler? PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } #endregion private ObservableCollectionlt;NamedOverlaygt; _namedOverlays; public ObservableCollectionlt;NamedOverlaygt; NamedOverlays { get { return _namedOverlays; } set { _namedOverlays = value; OnPropertyChanged(); } } public BMGraphicsOverlayCollection() { _namedOverlays = new ObservableCollectionlt;NamedOverlaygt;(); } public void Add(string name, GraphicsOverlay overlay) { NamedOverlay mOverlay = new NamedOverlay(); mOverlay.Name = name; mOverlay.Overlay = overlay; _namedOverlays.Add(mOverlay); } public void Add(string name, GraphicsOverlay overlay, IListlt;MapGraphicgt; graphics) { NamedOverlay mOverlay = new NamedOverlay(); mOverlay.Name = name; mOverlay.Overlay = overlay; mOverlay.Graphics = new ObservableCollectionlt;MapGraphicgt;(graphics); _namedOverlays.Add(mOverlay); } public IEnumerator GetEnumerator() { return _namedOverlays.GetEnumerator(); } } public class NamedOverlay : INotifyPropertyChanged { #region Event Property public event PropertyChangedEventHandler? PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } #endregion private string _name; public string Name { get { return _name; } set { _name = value; OnPropertyChanged(); } } private GraphicsOverlay _overlay; public GraphicsOverlay Overlay { get { return _overlay; } set { _overlay = value; OnPropertyChanged(); } } private ObservableCollectionlt;MapGraphicgt; _graphics; public ObservableCollectionlt;MapGraphicgt; Graphics { get { return _graphics; } set { _graphics = value; OnPropertyChanged(); } } } }
И соответствующая картографическая часть
private string _name; public string Name { get { if (_name == null) { return "Unnamed"; } else { return _name; } } set { _name = value; OnPropertyChanged(); } }
Заранее спасибо за помощь.
Комментарии:
1. Я не тестировал, но ваша привязка находится
Path=BMOverlayCollection
в xaml, который, похоже, больше нигде не отображается. Или это уровень (Коллекция) выше?2. Этот путь работает, я пропустил код для него из-за того, что он не имеет значения.
3. Хорошо, не могли бы вы добавить код для класса, который, тем не менее, является BMOverlayCollection. Я бы помог лучше понять структуру связанного элемента.
4. Код есть для класса, это второй блок на моем посту. Вы имеете в виду код, который создает экземпляр класса? Как я уже сказал, привязка работает просто отлично, я даже могу привязаться к свойству «Графика» (оно отображается как просто (Коллекция), когда я это делаю. Это когда я пытаюсь привязаться к свойству » Имя » в свойстве Graphics, тогда привязка завершается неудачно.
Ответ №1:
Согласно вашему коду, Ваша структура данных была названа Overlays[].Графика[].Имя, но ваш путь привязки был назван Overlays[].Graphics.Name. Вот в чем причина плохой привязки. Изменить
lt;TextBlock Text="{Binding Graphics.Name}" /gt;
кому (если вы хотите отобразить все имена в графическом виде)
lt;ListBox ItemsSource="{Binding Graphics}"gt; lt;ListBox.ItemTemplategt; lt;DataTemplategt; lt;TextBlock Text="{Binding Name}"/gt; lt;/DataTemplategt; lt;/ListBox.ItemTemplategt; lt;/ListBoxgt;
или (если вы просто хотите показать 1-е имя в графике)
lt;TextBlock Text="{Binding Graphics[0].Name}" /gt;
устранит проблему.
Комментарии:
1. В этом есть смысл. Я пытался сделать что-то подобное ранее, но это не сработало, я полагаю, потому что я не использовал другой шаблон данных. Большое спасибо за помощь!