2011-05-15 188 views
3

首先,我想,我的英语道歉是远远不够完善(它不是我的母语...)。WPF/C#组合框数据绑定

我已经在我的XAML代码与数据绑定的一个问题。我有一个combox,它应该列出我放在自定义画布上的所有图形节点。我的图形节点在列表graphCanvas.uinodes中引用,并且每个节点都有一个name。这就是我想要在我的组合框中显示的内容。

所以,我想是这样的:

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

但即使在我的画布我COMBOX是空的工程图节点后...

任何线索?

谢谢。

回答

1

A,使用ElementName结合找到具有该名称的WPF元件。我怀疑你已经子类Canvas并添加uinodes属性,它是唯一的方法,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> 
+0

然后我该如何更新我的组合框? – mmj 2011-05-15 10:03:34

+0

如果你绑定的是一个'ObservableCollection '或者任何实现了'INotifyCollectionChanged'的东西,你就不会。只需更新集合,绑定将为您更新“ComboBox”。 – 2011-05-15 17:51:34

0

你的绑定(特别是Path分配)看起来是错误的。假设uinodes是某种类型的Enumerable,它看起来好像你试图绑定到不存在的集合的`name'属性。试试这个:

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

另外,您可以使用输出窗口来查看任何绑定错误。

+0

事实上它的作品! 我以前使用的是由VS使用Combox的属性等生成的。它似乎没有我想象的那么好。 谢谢。 – mmj 2011-05-15 09:46:35

+0

但是我有另一个与该组合框有关的问题。 当我在画布上绘制节点N1,N2,N3之后打开我的组合框时,它们列在combox中。但是,之后,如果我尝试另一个节点它不会被添加到我的组合框。我不知道为什么ItemsSource没有更新。我尝试使用: ItemsSource =“{Binding ElementName = graphCanvas,Path = uinodes,UpdateSourceTrigger = LostFocus}”DisplayMemberPath =“name” – mmj 2011-05-15 09:57:35