2012-05-21 25 views
0

我想在WPF中實現一個可視化的表單設計器。我有一個Canvas,用戶可以拖放一些控件(Textbox,Textblock,Combobox,Checkbox,Image,Button)。到現在爲止還挺好。現在我試圖實現一個組合框,其中列出了用戶放置在畫布上的所有控件(如VS 2008所做的)。列表按鈕控件在組合框WPF C#4.0

組合框顯示控件的Name屬性。它適用於除按鈕和複選框以外的所有控件,我無法弄清楚原因。組合框綁定到一個ObservableCollection並且組合框的Item集合填充正確,但是當我選擇一個按鈕或複選框時,名稱不會顯示爲SelectedItem。所以,這裏是我的綁定:

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

您可以重現該問題,當你簡單填寫代碼隱藏一個ObservableCollection<T>按鈕和在其綁定的組合框。當您選擇它時,Combobox將不會顯示Button的名稱爲SelectedItem。 有人可以解釋我這種行爲或告訴我一個解決方法!?

在此先感謝

克里斯

P.S:我還試圖用ObservableCollection<FrameworkElement>,但它並沒有幫助。

+0

什麼顯示的不是名稱:隨着一點點的谷歌搜索,我碰到這個來了? – Richard

+0

什麼都沒有。它只是空的....但是當comboBox被展開時,按鈕/複選框的名稱在列表中。 –

+0

你能提供設置SelectedCtl的代碼嗎? –

回答

0

問題是Button是一個ContentControl,所以當選擇按鈕時,ComboBox的SelectionBoxItem使用Content屬性而不是Button本身。使用給定的綁定,然後嘗試在內容上找到Name屬性(我想這是一個字符串?)。這可以通過查看輸出中的綁定錯誤來發現。您應該看到如下所示的內容:

System.Windows.Data錯誤:40:BindingExpression路徑錯誤:在'object'''String'(HashCode = 1231357559)'找不到'Name'屬性。 BindingExpression:路徑=名稱; DataItem ='String'(HashCode = 1231357559);目標元素是'TextBlock'(Name ='');目標屬性是'文本'(類型'字符串')

如果您使用Snoop,當您單擊按鈕時,您會看到SelectionBoxItem是按鈕內容,而當您選擇不同的控件時,它是控件本身。

編輯:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/7054a9c9-fec1-463a-9568-b831729acd14