在Combobox WPF C#4.0中列出按钮控件

时间:2012-05-21 07:35:47

标签: c# wpf data-binding button combobox

我试图在WPF中实现可视化表单设计器。我有一个Canvas,用户可以拖动一些控件(文本框,文本块,组合框,复选框,图像,按钮)。到现在为止还挺好。现在我试图实现一个组合框,它列出了用户放在画布上的所有控件(就像VS 2008一样)。

组合框显示控件的名称属性。它适用于除按钮和复选框之外的所有控件,我无法弄清楚原因。 Combobox绑定到ObservableCollection并且Combobox的Item Collection被填充正确但是当我选择Button或Checkbox时,Name不会显示为SelectedItem。所以这是我的Binding:

<ComboBox Name="comboBoxCurrentControls" IsEditable="false"
          ItemsSource="{Binding AllFormControls}" DisplayMemberPath="Name" 
          SelectedValuePath="Name"
          SelectedItem="{Binding Path=SelectedCtl, Mode=TwoWay}"

当您使用按钮在Codebehind中简单填充ObservableCollection<T>并在其上绑定Combobox时,可以重现该问题。选择它时,Combobox不会将Button的名称显示为SelectedItem。 有人可以解释我这种行为或告诉我一个解决方法吗?

提前致谢

克里斯

P.s:我也尝试使用ObservableCollection<FrameworkElement>,但它没有帮助。

1 个答案:

答案 0 :(得分:0)

问题是Button是一个ContentControl,所以当选择按钮时,ComboBox的SelectionBoxItem使用Content属性而不是Button本身。使用给定的绑定,然后尝试在内容上找到Name属性(我想象的是一个字符串?)。通过查看绑定错误的输出可以发现这一点。你应该看到类似的东西:

System.Windows.Data错误:40:BindingExpression路径错误:'object'''String'(HashCode = 1231357559)'上找不到'Name'属性。 BindingExpression:路径=名称; DataItem ='String'(HashCode = 1231357559); target元素是'TextBlock'(Name =''); target属性是'Text'(类型'String')

如果您使用Snoop,当您单击Button时,您会看到SelectionBoxItem是按钮内容,而当您选择其他控件时,它是Control本身。

编辑:通过一点谷歌搜索,我遇到了这个:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/7054a9c9-fec1-463a-9568-b831729acd14