2015-09-17 66 views
2

我在執行如下組合框自動完成。自動完成工作正常。我面臨的唯一問題是,我希望我的SelectedItems顯示爲ItemNumber[space]ItemDescription。目前,當我從自動完成中選擇它時,它只顯示ItemNumber。你們可以修改下面的現有代碼嗎?WPF組合框的SelectedItem從自動完成

enter image description here

class ItemDetails 
{ 
    string _itemNumber; 
    string _itemDescription; 

    public string ItemNumber 
    { 
     get { return _itemNumber; } 
     set { _itemNumber = value; } 
    } 
    public string ItemDescription 
    { 
     get { return _itemDescription; } 
     set { _itemDescription = value; } 
    } 

    public ItemDetails() { } 
    public ItemDetails(string itemNo, string description) 
    { 
     _itemNumber = itemNo; 
     _itemDescription = description; 
    } 
} 

填充材料

private void InitMaterial() 
    { 
     List<ItemDetails> items = new List<ItemDetails>(); 

     for (int i = 0; i <= 1000; i++) 
     { 
      items.Add(new ItemDetails(i.ToString(), "Item " + i.ToString())); 
     } 

     cbo1.ItemsSource = items; 
    } 

XAML

<ComboBox x:Name="cboItemNoLegacy" HorizontalContentAlignment="Stretch" 
     TextSearch.TextPath="MaterialNumberLegacy" 
     ItemsSource="{Binding}" 
     IsSynchronizedWithCurrentItem="True" 
     IsEditable="True" 
     SelectedItem="{Binding LegacyItemNumber, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, Mode=TwoWay, Converter={StaticResource MaterialMasterConverter}}" 
     SelectionChanged="cboItemNoLegacy_SelectionChanged"> 
<ComboBox.ItemContainerStyle> 
    <Style> 
     <Setter Property="Control.Padding" Value="0"></Setter> 
     <Style.Triggers> 
      <Trigger Property="ComboBoxItem.IsSelected" Value="True"> 
       <Setter Property="ComboBoxItem.Background" Value="SkyBlue" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ComboBox.ItemContainerStyle> 
<ComboBox.ItemTemplate> 
    <DataTemplate> 
     <Grid Margin="0"> 
      <Border Margin="5" BorderThickness="0" BorderBrush="SteelBlue" 
       CornerRadius="1"> 
       <Grid HorizontalAlignment="Left"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition /> 
         <ColumnDefinition /> 
        </Grid.ColumnDefinitions> 

        <TextBlock x:Name="tbSiteCode" FontWeight="Normal" Text="{Binding Path=ItemNumber}" Margin="0,0,7,0"></TextBlock> 
        <TextBlock Grid.Column="1" x:Name="tbSiteDesc" FontWeight="Normal" Text="{Binding Path=ItemDescription}" Margin="0,0,7,0"></TextBlock> 
       </Grid> 
      </Border> 
     </Grid> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 

+0

因此,您有ItemDetails的綁定列表('ItemsSource =「{Binding}」')到ItemsSource的組合框,其中MaterialNumberLegacy和MaterialDescription屬性來自哪裏?自動填充到底意味着什麼? –

+0

@NovitchiS 我已經編輯我上面的代碼,包括我如何填充組合框。我還更新了XAML以使用我使用的正確屬性。 那麼將在自動完成功能中顯示在組合框中的文本將有所不同。當我在組合框中選擇一個項目時,刪除了組合框中的自動完成設置,它顯示ItemNumber和ItemDescription。但是,如果我的組合框中存在自動完成設置,則只有ItemNumber會顯示在組合框中。 您可以查看我附上的供參考的上述圖片。 – klaydze

回答

3

當您設置一個組合框選擇區域所選擇的項目將不會被渲染二手商品的DataTemplate中的IsEditable=True財產。在這種情況下,您將擁有一個TextBox控件。這個TextBox控件只能顯示一個String。

所以,你必須做的是提供與要顯示在選擇區域所需的格式化字符串文本框的屬性。 TextSearch.TextPath屬性用於指定Item對象中的哪些屬性應視爲TextBox和TextSearch功能的值。

屬性添加到您ItemDetails類聚合字符串值:

public string AggregatedDescription 
{ 
    get { return String.Format("{0} {1}", ItemNumber, ItemDescription);} 
} 

將此屬性設置爲組合框元素TextSearch.TextPath="AggregatedDescription"

另一種解決方案(我喜歡這個)將只覆蓋ItemDetails的ToString()方法以獲得所需的格式化值:

public override string ToString() 
{ 
    return String.Format("{0} {1}", ItemNumber, ItemDescription); 
} 

在這種情況下,你不應該SPE規定TextSearch.TextPath財產。如果未設置,則當前選定項目的.ToString()值將用作TextSearch功能的字符串。

+0

不錯!兩人都接近完美!非常感謝! – klaydze