Привязка данных WPF / C # Combobox

#c# #.net #wpf #xaml #binding

#c# #.net #wpf #xaml #привязка

Вопрос:

Для начала я хотел бы извиниться за мой английский, который далек от совершенства (это не мой родной язык …).

У меня проблема, связанная с привязкой данных в моем коде XAML. У меня есть combox, который должен содержать список всех графических узлов, которые я размещаю на пользовательском холсте. Ссылки на мои графические узлы содержатся в списке graphCanvas.uinodes , и у каждого узла есть name . И это то, что я хочу показать в моем combobox.

Итак, я попробовал что-то вроде этого:

 <ComboBox ItemsSource="{Binding ElementName=graphCanvas, Path=uinodes/name}"
    Height="23" HorizontalAlignment="Left" Name="comboBox1"
    VerticalAlignment="Top" Width="71" Foreground="Black"  />
  

Но даже после рисования узлов на моем canvas мой combox пуст…

Есть какие-нибудь подсказки?

Спасибо.

Ответ №1:

Привязка с использованием ElementName находит элемент WPF с этим именем. Я сомневаюсь, что вы сделали подкласс Canvas и добавили к нему uinodes свойство, которое является единственным способом Path найти что-то, даже если синтаксис path был правильным, а это не так.

Если вы посмотрите в окно вывода при запуске своей программы, вы увидите сообщение об ошибке, в котором объясняется, почему привязка не работает. Это только начало.

Но даже тогда вы не получите то, что хотите, при таком подходе. То, что вы, вероятно, хотите, больше похоже:

 <ComboBox ItemsSource="{Binding ElementName=graphCanvas, Path=uinodes}" 
          DisplayMemberPath="name"/>
  

или даже

 <ComboBox ItemsSource="{Binding ElementName=graphCanvas, Path=uinodes}">
   <ComboBox.ItemTemplate>
      <TextBlock Text="{Binding name}"/>
   </ComboBox.ItemTemplate>
</ComboBox>
  

Комментарии:

1. Если то, к чему вы привязываетесь, является ObservableCollection<T> или чем-либо, что реализует INotifyCollectionChanged , вы этого не делаете. Просто обновите коллекцию, и привязка обновит ComboBox для вас.

Ответ №2:

Ваша привязка (в частности, Path назначение) выглядит неправильно. Предполагая, что uinodes является каким-то перечислимым, это выглядит так, как будто вы пытаетесь выполнить привязку к свойству `name’ коллекции, которая не существует. Попробуйте это:

 ItemsSource="{Binding ElementName=graphCanvas, Path=uinodes}" DisplayMemberPath="name"
  

Кроме того, вы можете использовать окно вывода, чтобы увидеть любые ошибки привязки.

Комментарии:

1. Действительно, это работает! То, что я использовал ранее, было сгенерировано VS с использованием свойств Combox и т.д. Похоже, это не так хорошо, как я думал. Спасибо.

2. Однако у меня есть другая проблема, связанная с этим combobox. Когда я открываю свой combobox сразу после рисования узлов N1, N2, N3 на моем canvas, они перечислены в combox. Однако, после этого, если я попробую другой узел, он не будет добавлен в мой combobox. И я не знаю, почему ItemsSource не обновляется. Я пытался использовать: ItemsSource=»{ИмяэлемЕнта привязки=GraphCanvas, Путь =uinodes, UpdateSourceTrigger=LostFocus}» DisplayMemberPath=»name»