0

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

组合框显示控件的名称属性。它适用于除按钮和复选框之外的所有控件,我不知道为什么。Combobox 绑定到 ObservableCollection,并且 Combobox 的 Item Collection 填充正确,但是当我选择 Button 或 Checkbox 时,名称不显示为 SelectedItem。所以这是我的绑定:

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

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

提前致谢

克里斯

Ps:我也试过用ObservableCollection<FrameworkElement>,但是没有用。

4

1 回答 1

0

The problem is that Button is a ContentControl so when the button is selected, the ComboBox's SelectionBoxItem uses the Content property rather than the Button itself. 使用给定的绑定,它会尝试在内容上找到 Name 属性(我想这是一个字符串?)。这可以通过查看绑定错误的输出来发现。您应该会看到如下内容:

System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“字符串”(HashCode = 1231357559)上找不到“名称”属性。绑定表达式:路径=名称;DataItem='String' (HashCode=1231357559); 目标元素是'TextBlock'(名称='');目标属性是“文本”(类型“字符串”)

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

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

于 2012-05-23T13:08:54.383 回答