2012-12-20 50 views
6

我環顧四周,發現了一些東西,現在卡在了下拉區域顯示的兩列的組合框中。我有一個可用的xaml主題,並且組合框「樣式」被定義,並且如預期那樣運行良好,所以這部分是可以的。WPF Style Combobox在下拉列中有兩列

現在,我有一個組合框,我需要顯示兩個值,將其視爲下拉的狀態縮寫和狀態名稱,來自項目的DataTable.DefaultView綁定源。

如果我有

<my:cboStates TextSearch.TextPath="StateAbbrev"> 
    <ComboBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal" TextSearch.Text="{Binding Path=StateAbbrev}"> 
     <TextBlock Text="{Binding Path=StateAbbrev}"/> 
     <TextBlock Text="{Binding Path=FullStateName}" Margin="10 0"/> 
     </StackPanel> 
    </DataTemplate> 
    </ComboBox.ItemTemplate> 
</my:cboStates> 

這個工程。現在,我如何/在哪裏被卡住......現在,我想要說5種不同形式的相同功能,並且所有內容都顯示相同的內容,並且如果有過更改(不是這個,但對於其他多列組合框),我不想一直把這個直接放在窗體的XAML文件中。

我一直希望把主題的資源字典文件,並不斷重複使用「風格」反覆。說得通。然而,當我這樣做,並且綁定是將數據表,唯一的結果試圖做一個樣式是下拉當我得到顯示

System.Data.DataRowView 
System.Data.DataRowView 
System.Data.DataRowView 
System.Data.DataRowView 

而不是實際的2列的值。 這裏是我在「主題」資源字典中的內容。

<DataTemplate x:Key="myStateComboTemplate" > 
    <StackPanel Orientation="Horizontal" > 
    <TextBlock Text="{Binding Path=StateAbbrev}"/> 
    <TextBlock Text="{Binding Path=FullStateName}"/> 
    </StackPanel> 
</DataTemplate> 

<Style x:Key="StyleMyStatesCombobox" TargetType="{x:Type ComboBox}" 
    BasedOn="{StaticResource MyOtherWorkingComboBoxStyle}" > 
    <Setter Property="TextSearch.TextPath" Value="{Binding Path=StateAbbrev}" /> 
    <Setter Property="ItemTemplate" Value="{StaticResource myStateComboTemplate}" /> 
</Style> 

所以,如果我有兩個實例,我的「cboStates」類的窗體上創建的,並設置一個第一家上市的明確造型,以及基於「樣式」設置第二個,第二個由失敗只顯示重複的System.Data.DataRowView條目,而不是實際的數據內容。

我錯過了什麼。

因此,要澄清什麼我正在尋找... 美國...恩數據

AL Alabama 
AK Alaska 
AZ Arizona 
AR Arkansas 
CA California 
CO Colorado 
CT Connecticut 
DE Delaware 

我想組合框將顯示縮寫 AL,AK,AZ等窄組合框。這也將是返回時的「SelectedValue」。

實際的下拉列表將顯示上面列出的數據,顯示縮寫和狀態的長描述。

樣品所需的組合框

enter image description here

+0

爲什麼你不能將兩者結合在一起?我以爲你總是可以嘗試使用一個Tuple,但不知道如何工作。 –

+0

@Bob,被認爲是Tuple,但這只是一個簡單的例子,它將被組裝到任何人都能理解的組合框中。我實際上會有各種類似的組合框,它們會有來自表格的數據並且可能會有所不同,因此不是固定值。我不想查詢數據庫,然後循環訪問另一個存儲元組,以便根據結果組合框表示需要重新分析鍵/值/替換值/額外鍵等。 – DRapp

+0

怎麼樣'Dictionary '?將'Key'綁定到一個'TextBlock'和'Value'到另一個'TextBlock'?還是有更多可能超過兩行? –

回答

0

終於得到它的工作......併爲那些嘗試類似。由於我試圖創建一個可以在整個過程中使用的標準「類」實例,但不希望在每個頁面中明確強制引用XAML,因此部分樣式必須在實際的代碼內類實例中處理。由於我不完全知道.net框架如何構建其所有控件,樣式分配等,我感到沮喪的是,如果直接從xaml運行,但在代碼中失敗,它會起作用。所以,我最終強化了代碼中的項目模板和TextSearch.TextPath值。以下是該類別的簡短摘要

public class myStatesCombo : ComboBox 
{ 
    public myStatesCombo() 
    { 
     Loaded += myAfterLoaded; 
    } 

    protected static DataTable myTableOfStates; 

    public void myAfterLoaded() 
    { 
     if(myTableOfStates == null) 
     myTableOfStates = new DataTable(); 

     CallProcedureToPopulateStates(myTableOfStates); 

     ItemsSource = myTableOfStates.DefaultView; 

     // AFTER the object is created, and all default styles attempted to be set, 
     // FORCE looking for the resource of the "DataTemplate" in the themes.xaml file 
     object tryFindObj = TryFindResource("myStateComboTemplate"); 
     if(tryFindObj is DataTemplate) 
     ItemTemplate = (DataTemplate)tryFindObj; 

     // NOW, the CRITICAL component missed in the source code 
     TextSearch.SetTextPath(this, "StateAbbrev"); 
    } 
} 

現在,特別說明。在我用來填充DataTable的例程中,我預先檢查表是否存在。我第一次創建表格。如果我需要重新填充它,如果我每次都繼續創建一個「新的DataTable」,它會吹走數據/項目模板綁定。爲了防止這種情況,我會再做

if(myTableOfStates.Rows.Count > 0) 
    myTableOfStates.Rows.Clear(); 

然後,我打電話給我的

Sqlexecute呼叫從數據庫(DataAdapter的)查詢,並填寫()的數據表。

所以,現在所有的東西都顯示正確填充,顯示和文本搜索的綁定完成並準備就緒。