2009-07-10 38 views
5

我使用數據模板來顯示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'應該自動建立漢斯彼得。

任何解決方案?

+0

至少現在我覺得很自信,這個任務確實不是太容易。或長文本只是讓人們在恐慌中逃跑... – 2009-07-12 15:27:44

+0

我接近放棄它。我設法通過在ComboBox.ItemContainerStyle(而不是ItemTemplate,如我以前那樣)中設置ComboBoxItem來攜帶正確的TextSearch.Text-Property。 現在,它在可視樹(Snoop再次)中看起來相當不錯,但不幸的是它沒有任何效果。輸入'Hans'之後沒有選擇。 – 2009-07-13 21:09:43

回答

1

圍繞您面板的東西是默認容器。您需要將TextSearch.Text屬性應用於容器。您應該能夠通過設置通過ItemContainerStyle財產,像這樣做:

<ComboBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ComboBoxItem}"> 
     <Setter Property="TextSearch.Text"> 
      <Setter.Value> 
       <MultiBinding StringFormat="{} {0} {1}"> 
        <Binding Path="FirstName"/> 
        <Binding Path="LastName"/> 
       </MultiBinding> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ComboBox.ItemContainerStyle> 
+0

聽起來完全合理,但不幸的是沒有成功。 鍵盤選擇的行爲不符合要求,可能輸入仍然與人物的ToString值進行比較,textsearch.text根本沒有任何效果。 我想綁定確實有效,但組合框忽略它。 – 2009-11-17 19:54:21

8

簡短的回答:你想要做什麼不能在XAML直接完成,但也有其他的方法來做到這一點。

長答案:ComboBox直接在存儲在Items或ItemsSource集合中的數據項上查找TextSearch.Text屬性。因此,不能在數據模板或樣式中設置屬性,因爲它們適用於用於顯示數據項的對象,而不適用於數據項本身。

特別是,如果您查看TextSearch class頁面上的示例,您會看到它們將TextSearch.Text屬性附加到進入ComboBox.Items集合的Image對象。你可以通過使Person成爲一個DependencyObject來實現你的程序,但我不認爲你想要像這樣設置每個對象的屬性。

您有幾種選擇在這裏:

如果你可以修改Person類,你可以定義的ToString()方法返回的文本自動完成或定義諸如全名,並設置Textsearch.TextPath任意屬性在組合框上。例如:

public class Person 
{ 
    string FirstName { get; set; } 
    string LastName {get; set; } 
    string FullName { get { return String.Format("{0} {1}", FirstName, LastName); } } 
} 

<ComboBox TextSearch.TextPath="FullName" ItemsSource="collectionOfPersons"/> 

Altenatively,如果你不想碰的人,你可以創建一個公開這些屬性的包裝類。

相關問題