带有清除按钮的WPF组合框

4
我正在尝试创建一个WPF ComboBox控件,当某些内容被选中时,该控件会包含一个清除按钮。该控件应具有两种状态:如果选择了某些内容,则该控件看起来像带有清除按钮的标签。如果没有选择任何内容,则显示普通ComboBox。下面的图片展示了这两种状态。

enter image description here

在研究我的问题时,我发现了以下与我的问题非常相似的SO问题:

如何在WPF中向组合框添加按钮

如何对WPF ComboBox进行子类化以添加额外的按钮

两者都建议对ComboBox进行子类化,并提供具有额外按钮的修改模板。但这就是我有点困惑的地方。第二个链接问题的John Bowen的答案表明,我应该复制ComboBox的默认模板;从Blend中获取模板并进行修改以包含按钮。由于不熟练使用Blend,我在MSDN上找到了模板:

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

我的问题是我不太确定我应该做什么改变。查看默认模板,我认为我需要做以下操作:
  • 创建一个新的“IsSelected”属性,我可以将触发器连接到该属性。
  • 添加一个带有触发器的“清除按钮”控件模板,以隐藏该按钮。
  • 将IsSelected触发器附加到ComboBoxToggleButton控件模板上,在选择后隐藏它。
  • 当IsSelected为true时,以某种方式调整ComboBox模板中的PART_EditableTextBox文本框的大小。
这样做是否正确?如果我走错了,请给出指导或其他建议。

你可以使用转换器(谷歌一下)根据选择设置两个控件的可见性。我没有时间给出示例,所以不会将其发布为答案。 - JeremyK
你确实需要构建一个新的控件模板,但是你需要创建一个新的VisualState,当某些东西被选中时它会被打开。如果你利用VisualState,那么当清除按钮将SelectedValue设置为null时,它将会正确响应。 - Mike Perrenoud
1个回答

4

也许您可以接受一个更简单的方案-只需在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>

代码后台将有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(...){...}
}

这就是我在评论中提出的建议。我相信还有其他方法可以做到,但这个方法很有效。 - JeremyK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接