Привязка данных к свойству в коллекции в другой коллекции

#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. В этом есть смысл. Я пытался сделать что-то подобное ранее, но это не сработало, я полагаю, потому что я не использовал другой шаблон данных. Большое спасибо за помощь!