2013-06-12 84 views
2

我想創建一個WPF組合框控件,其中包含一個清除按鈕時,選擇了某些東西。控件應該有兩種狀態:如果選擇了某個東西,控件看起來就像一個帶有清晰按鈕的標籤。如果沒有選擇,則顯示正常的組合框。下面的圖片顯示了這兩個州。WPF Combobox與清除按鈕

enter image description here

研究我的問題,我遇到以下做題,這是非常類似地雷傳來:

Adding a button to a combobox in wpf

How to subclass a WPF ComboBox to add an extra button

都表明子類組合框提供了修改後的模板額外的按鈕。但這是我有點困惑的地方。 John Bowen對第二個鏈接問題的回答表明我應該複製ComboBox的默認模板;修改它以包含從Blend獲取模板的按鈕。不是精通融合,我發現MSDN上的模板的位置:

http://msdn.microsoft.com/en-us/library/ms752094(v=vs.85).aspx

我的問題是我不太知道我應該改變。看看默認模板,我認爲我需要按照以下方法做一些事情:

  • 創建一個新的'IsSelected'屬性,我可以將觸發器鉤住。
  • 添加一個清除按鈕的控制模板,觸發器連接到隱藏按鈕的IsSelected。
  • 將IsSelected觸發器附加到ComboBoxToggleButton控件模板以在選擇時隱藏它。
  • 當IsSelected爲true時,以某種方式在組合框模板中重新調整PART_EditableTextBox文本框的大小。

這似乎是正確的,如果我吠叫錯誤的樹,我怎麼做或任何其他建議的指針。

+0

你可以使用一個轉換器(谷歌它)來設置基於選擇的兩個控件的可見性。我沒有時間舉一個例子,所以我不會將它作爲答案發布。 – JeremyK

+0

您確實需要構建一個新的控件模板,但是您需要創建一個新的「VisualState」,該對象在選擇某些內容時打開。如果你使用'VisualState',那麼當清除按鈕將'SelectedValue'設置爲'null'時,它會正確響應。 –

回答

4

也許你會接受一個更簡單的解決方案 - 只需將一個TextBlock放置在ComboBox上方的按鈕上?

的XAML看起來像這樣:

<Grid> 
    <ComboBox ItemsSource="{Binding ...}" x:Name="cbox"/> 
    <Grid Background="Gray" Visibility="{Binding SelectedItem, ElementName=cbox, Converter={StaticResource NullItem2Visibility}}"> 
     <TextBlock Text="{Binding SelectedItem, ElementName=cbox}" HorizontalAlignment="Left"/> 
     <Button Content="Clear" HorizontalAlignment="Right" Click="ClearItem"/> 
    <Grid> 
</Grid> 

代碼隱藏會有方法ClearItem:

public void ClearItem(object sender, EventArgs e){ 
    cbox.SelectedItem=null; 
} 

和轉換器來顯示和隱藏文本塊和一個按鈕:

class NullItem2Visibility:IValueConverter{ 
    public object Convert(object value, Type type, object parameter, CultureInfo i){ 
     return value == null ? Visibility.Collapsed : Visibility.Visible; 
    } 
    public object ConvertBack(...){...} 
} 
+0

這就是我的建議與我的評論。我相信還有其他方法可以做到,但這個方法運作良好。 – JeremyK