【问题标题】:WPF Combobox with clear button带有清除按钮的 WPF 组合框
【发布时间】:2013-06-13 04:36:26
【问题描述】:

我正在尝试创建一个 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 获取模板的按钮。不精通混合我在这里找到了 MSDN 上的模板:

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

我的问题是我不太确定我应该改变什么。查看默认模板,我认为我需要按照以下方式做一些事情:

  • 创建一个新的“IsSelected”属性,我可以将触发器挂接到该属性。
  • 为 Clear Button 添加一个控件模板,其中触发器附加到 IsSelected 以隐藏按钮。
  • 将 IsSelected 触发器附加到 ComboBoxToggleButton 控件模板以在选择时将其隐藏。
  • 当 IsSelected 为 true 时,以某种方式重新调整组合框模板中 PART_EditableTextBox 文本框的大小。

这看起来是否正确,以及我如何做的任何指示或其他建议,如果我叫错了树。

【问题讨论】:

  • 您可以使用转换器(google it)根据选择设置两个控件的可见性。我没有时间举个例子,所以我不会把它作为答案发布
  • 您确实需要构建一个新的控件模板,但您需要创建一个新的VisualState,它会在选择某些内容时打开。如果您利用VisualState,那么当清除按钮将SelectedValue 设置为null 时,它将正确响应。

标签: c# wpf combobox custom-controls


【解决方案1】:

也许您会接受一个更简单的解决方案 - 只需在您的 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(...){...}
}

【讨论】:

  • 这就是我在评论中所建议的。我相信还有其他方法可以做到这一点,但这个方法效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多