我正在尝试创建一个 WPF ComboBox 控件,该控件在选择某些内容时包含一个清除按钮。该控件应具有两种状态:如果选择了某些内容,则该控件看起来像带有清除按钮的标签。如果未选择任何内容,则会显示一个普通的 ComboBox。这两种状态如下图所示。
研究我的问题时,我遇到了以下与我非常相似的 SO 问题:
Adding a button to a combobox in wpf
How to subclass a WPF ComboBox to add an extra button
两者都建议对 ComboBox 进行子类化,提供带有额外按钮的修改模板。但这是我有点困惑的地方。 John Bowen 对第二个链接问题的回答表明我应该复制 ComboBox 的默认模板;修改它以包含一个从 Blend 获取模板的按钮。由于不精通 blend,我在 MSDN 上找到了模板:
http://msdn.microsoft.com/en-us/library/ms752094(v=vs.85).aspx
我的问题是我不太确定应该更改什么。查看默认模板,我认为我需要按照以下方式做一些事情:
- 创建一个新的“IsSelected”属性,我可以将触发器挂接到该属性。
- 为清除按钮添加一个控件模板,触发器附加到隐藏按钮的 IsSelected。
- 将 IsSelected 触发器附加到 ComboBoxToggleButton 控件模板以在选择时将其隐藏。
- 当 IsSelected 为真时,以某种方式重新调整 ComboBox 模板中
PART_EditableTextBox
文本框的大小。
这看起来正确吗?如果我找错了树,有任何关于我如何做的指示或其他建议。
最佳答案
也许您会接受一个更简单的解决方案 - 只需在 ComboBox 上方放置一个带有 Button 的 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;
}
以及显示和隐藏文本 block 和按钮的转换器:
class NullItem2Visibility:IValueConverter{
public object Convert(object value, Type type, object parameter, CultureInfo i){
return value == null ? Visibility.Collapsed : Visibility.Visible;
}
public object ConvertBack(...){...}
}
关于c# - 带清除按钮的 WPF 组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17074509/