我使用數據模板來顯示ComboBox中的一些項目, ItemsSource綁定到ObservableCollection。 爲了簡單起見,讓我們說我把人進入的ObservableCollection:通過DataTemplate爲WPF-ComboBoxItem設置TextSearch.Text
public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
}
我DataTemplate中看起來是這樣的:
<DataTemplate TargetType="{x:Type Person}">
<StackPanel Orientation="Horizontal">
<TextSearch.Text>
<MultiBinding StringFormat="{} {0} {1}">
<Binding Path="FirstName"/>
<Binding Path="LastName"/>
</MultiBinding>
</TextSearch.Text>
<TextBlock Text="{Binding FirstName}" Margin="2,0" />
<TextBlock Text="{Binding LastName}"/>
</StackPanel>
</DataTemplate>
現在我希望能夠在組合框的全名自動完成,而不會引入我的人課上的第三項財產。因此,我不想在ComboBox上使用TextSearch.TextPath屬性,但是我想要綁定DataTemplate中每個ComboBoxItem的TextSearch.Text-屬性。 不幸的是,當我這樣做的時候(使用MultiBinding和StringFormat,使用Snoop進行測試),綁定值僅爲我的StackPanel註冊,但使用Snoop(很棒的工具),我發現這個堆棧面板只是作爲內容ComboBoxItemTemplate,其中放置另一個邊框等,最後是我的外部StackPanel附近的ComboBoxItem標籤。因此,TextSearch.Text設置無效,因爲它必須在創建的ComboBoxItem中設置,而不是位於其中的某處。
現在問題:如何使用XAML樣式和控制模板將此TextSearch.Text-Property從我的DataTemplate傳播到周圍的ComboBoxItem? 該解決方案可能會修改ComboBox和ComboBoxItem的默認ControlTemplates以及我的自定義(Item-)DataTemplate,但不會使用任何代碼隱藏,或者至少不會太多。也許附加的行爲也可以。但是我幾乎可以肯定,必須有一種方法可以讓它在沒有TemplateBinding或RelativeSource的情況下工作... 當然,解決方案必須使我的鍵盤選擇和textcompletion工作,s.th。當名單中包含漢斯約瑟夫和漢斯彼得時,那麼進入'漢斯'應該自動建立漢斯約瑟夫,而快速進入'漢斯P'應該自動建立漢斯彼得。
任何解決方案?
至少現在我覺得很自信,這個任務確實不是太容易。或長文本只是讓人們在恐慌中逃跑... – 2009-07-12 15:27:44
我接近放棄它。我設法通過在ComboBox.ItemContainerStyle(而不是ItemTemplate,如我以前那樣)中設置ComboBoxItem來攜帶正確的TextSearch.Text-Property。 現在,它在可視樹(Snoop再次)中看起來相當不錯,但不幸的是它沒有任何效果。輸入'Hans'之後沒有選擇。 – 2009-07-13 21:09:43