2009-02-06 28 views
0

我在WPF中有一個ComboBox,它是數據綁定的,並且有控制每個項目顯示方式的數據模板。我已經做好了讓每個項目都顯示兩位文本(用於名稱和路徑屬性)和一個圖像(用於圖標屬性)。控制哪個字段顯示在數據綁定的文本框部分WPF組合框

當我從ComboBox中選擇一個項目時,ComboBox的文本框位會改變爲「TestWPF.Result」,這是我用ComboBox填充的類的名稱。

我感興趣的一個(或兩個)的兩件事情:

  1. 我如何改變它,這樣它顯示的領域之一,存在(如因此它顯示的值的值。名稱字段的名稱而不是類的名稱)?

  2. 是否有可能讓它在項目列表中使用相同的DataTemplate,以便一旦我選擇了一個項目,它將以與其在項目列表中相同的方式顯示在關閉的組合框中。基本上我有一個名爲ShowResults的DataTemplate和一個使用該模板的ComboBox。我還在一個單獨的ContentControl中添加了我必須在ComboBox中顯示所選項目的詳細信息,但我希望能夠替換ComboBox中的文本框。

更新:

感謝您的第一個答案。正如你所描述的,我嘗試過使用單獨的ContentControl,並且它工作正常。現在的問題是如何用這個ContentControl替換ComboBox的文本框部分。任何提示都會受到歡迎。

此外,是否有可能用ContentControl和文本框的混合替換ComboBox控件的文本框位,這樣我仍然可以鍵入文本框以幫助從ComboBox中選擇項目,但是當我關閉時下拉剩下的ContentControl位將填充文本和圖標的其餘部分。希望這是有道理的 - 如果問題不存在,就提出問題!

代碼:

我一直在問後我的代碼 - 所以在這兒呢。我試圖刪除的東西,我知道肯定是不相關的,但我不知道到底是什麼有關,所以當有疑問我離開的事情英寸

<Window x:Class="TestWPF.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:custom="clr-namespace:TestWPF" 
Title="Window1" Height="300" Width="843" Loaded="Window_Loaded"> 
<Window.Resources> 
    <DataTemplate x:Key="ShowResult" DataType="TestWPF.Result"> 
     <StackPanel Margin="5" Orientation="Horizontal"> 
      <Image Width="32" Height="32" Source="{Binding Path=Image}"/> 
      <StackPanel Margin="5"> 
       <TextBlock FontWeight="Bold" Text="{Binding Path=Name}"/>      
       <TextBlock Text="{Binding Path=Path}"/> 
      </StackPanel> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 

<Grid Width="786"> 
    <Button Height="23" HorizontalAlignment="Right" Margin="0,24,166,0" Name="btnTest" VerticalAlignment="Top" Width="75" Click="btnTest_Click">Add</Button> 
    <ComboBox StaysOpenOnEdit="True" DropDownClosed="comboBox1_DropDownClosed" PreviewTextInput="comboBox1_PreviewTextInput" SelectionChanged="comboBox1_SelectionChanged" ItemTemplate="{StaticResource ShowResult}" Margin="259,109,22,89" Name="comboBox1" IsEditable="True" /> 
    <ContentControl Height="50" Margin="268,0,22,21" Name="contentControl1" VerticalAlignment="Bottom" Content="{Binding ElementName=comboBox1,Path=SelectedValue}" ContentTemplate="{StaticResource ShowResult}"/> 
</Grid> 

回答

0

剛剛發生的Property綁定到textBox的表達式,您不需要應用模板。

另一種方式來獲得確切的數據模板,放置一個ContentControl中的文本框的位置和分配相同的DataTemplate(例如x:名稱=「robinTemplate」)

<ContentControl Content="{Binding ElementName=cmbBox,Path=SelectedValue}" ContentTemplate="{StaticResource robinTemplate}"/> 

爲了使選定的內容顯示在同樣的方法: 創建組合框控件模板的副本,您將在那裏找到一個ContentPresenter。將其替換爲ContentControl ..但這不是正確的解決方案。

+0

感謝您的答覆。我將如何將ContentControl放置在TextBox的位置?你有更大的代碼示例,所以我可以看到如何做到這一點? – robintw 2009-02-06 19:26:09

1

您得到了正確的綁定部分 - 綁定到數據並使用DataTemplate以您想要的方式顯示源。

至於你的第二個問題,一種方法是使用帶有IsEditable =「True」的ComboBox,並使用TextChanged事件處理程序檢查comboBox.Items是否包含新值,如果不是檢查使用LINQ SEACH的比賽:

 
if (comboBox.Items.Contains(e.NewValue)) 
    return;
var matches = with comboBox.Items select item where item.BeginsWith(e.NewValue);
if (matches.Count > 0) comboBox.SelectedItem = matches.First();