Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带清除按钮的WPF组合框_C#_Wpf_Combobox_Custom Controls - Fatal编程技术网

C# 带清除按钮的WPF组合框

C# 带清除按钮的WPF组合框,c#,wpf,combobox,custom-controls,C#,Wpf,Combobox,Custom Controls,我试图创建一个WPF组合框控件,当选择某个对象时,该控件包含一个清除按钮。控件应该有两种状态:如果选择了某个对象,则控件看起来像带有清除按钮的标签。如果未选择任何内容,则显示普通组合框。这两种状态如下图所示 在研究我的问题时,我遇到了以下与我非常相似的问题: 两者都建议子类化ComboBox,提供带有额外按钮的修改模板。但这就是我有点困惑的地方。John Bowen对第二个链接问题的回答表明我应该复制ComboBox的默认模板;修改它以包含一个从Blend获取模板的按钮。由于不熟悉混合,我

我试图创建一个WPF组合框控件,当选择某个对象时,该控件包含一个清除按钮。控件应该有两种状态:如果选择了某个对象,则控件看起来像带有清除按钮的标签。如果未选择任何内容,则显示普通组合框。这两种状态如下图所示

在研究我的问题时,我遇到了以下与我非常相似的问题:

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

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

  • 创建一个新的“IsSelected”属性,我可以将触发器挂接到该属性
  • 为“清除”按钮添加控件模板,并将触发器连接到IsSelected,从而隐藏该按钮
  • 将IsSelected触发器附加到ComboBoxToggleButton控件模板以在选择时隐藏它
  • 当IsSelected为true时,以某种方式重新调整组合框模板中的
    部分\u EditableTextBox
    文本框的大小

如果我选错了树,这似乎是对的,还有关于我如何做的任何提示或其他建议。

也许你会接受一个更简单的解决方案-只需在组合框上方放置一个带有按钮的文本块

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>
以及用于显示和隐藏文本块的转换器和按钮:

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

您可以使用转换器(google it)根据选择设置两个控件的可见性。我没有时间给出一个示例,因此我不会将其作为答案发布。您确实需要构建一个新的控件模板,但您需要创建一个新的
VisualState
,当选择某个对象时,该模板将打开。如果您利用
VisualState
,则当清除按钮将
SelectedValue
设置为
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(...){...}
}