我正在尝试创建一个WPF ComboBox控件,该控件在选择某些内容时包含一个清除按钮。控件应该有两种状态:如果选择了某些内容,控件看起来就像带有清除按钮的标签。如果没有选择,则显示正常的ComboBox。这两个州如下图所示。
研究我的问题我遇到了以下非常类似于我的问题:
Adding a button to a combobox in wpf
How to subclass a WPF ComboBox to add an extra button
两者都建议子类化ComboBox,提供带有额外按钮的修改模板。但这是我有点困惑的地方。 John Bowen对第二个链接问题的回答表明我应该复制ComboBox的默认模板;修改它以包括从Blend获取模板的按钮。不熟悉混合我在MSDN上找到了模板:
http://msdn.microsoft.com/en-us/library/ms752094(v=vs.85).aspx
我的问题是我不太确定应该改变什么。看一下Default模板,我想我需要做一些事情:
PART_EditableTextBox
文本框的大小。如果我咆哮错误的树,这看起来是否正确,以及我如何做或任何建议的任何指示。
答案 0 :(得分:4)
也许您会接受一个更简单的解决方案 - 只需在ComboBox上方放置一个带按钮的TextBlock?
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>
Codebehind将有方法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(...){...}
}