#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»