WPF - 带有提示符的组合框

时间:2009-11-02 19:12:59

标签: wpf combobox prompt

我正在寻找一种方法来将“SELECT An Item”添加到没有选择项目的组合框中。这与默认的选定项目不同。

我希望组合框说出“SELECT a Item”并绑定到一个列表以获取可能的选择,并绑定到所选项目的另一个模型。

我更喜欢一种可以应用于多个组合框的样式,并且可以设置提示。我在http://marlongrech.wordpress.com/2008/03/09/input-prompt-support-in-wpf/看到了类似的内容,但它不能顺利运行,只需点击2次即可进入列表。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用您链接到的adorner解决方案进行一些更改,或者您可以使用样式和转换器执行此操作。

Adorner解决方案

adorner解决方案更复杂,但具有更好的界面和封装。您需要进行的更改很简单,但如果您不是WPF专家,则可能很难。他们是:

  1. 将ComboBox识别为另一种特殊情况(如TextBox)。订阅其SelectedItemChanged,并使用SelectedItem == null更新装配工可见性。

  2. 不处理输入事件(HitTestVisible = False,Focusable = False等)

  3. 在这种情况下,您的ComboBox样式将非常简单,只需设置附加属性即可。

    样式和转换器

    使用样式和转换器执行此操作可能更简单。这是转换器的主体:

      object Convert(object value, Type targetType, object parameter, CultureInfo culture)
      {
        return value==null ? Visibility.Visible : Visibility.Hidden;
      }
    

    您的样式将替换默认的ComboBox样式,并包含主题中的ControlTemplate副本,包含此类内容(或使用装饰器):

      <Style TargetType="{x:Class ComboBox}">
        <Style.Setters>
          <Setter Property="local:MyInputPromptClass.PromptText" Value="SELECT an item" />
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate TargetType="{x:Class ComboBox}">
                <Grid>
                  ... existing XAML from theme ControlTemplate ...
                  <TextBlock
                    Text="{Binding local:MyInputPromptClass.PromptText, RelativeSource={RelativeSource TemplatedParent}}"
                    Visibility="{Binding SelectedItem, Converter={x:Static local:MyInputPromptClass.Converter}, RelativeSource={RelativeSource TemplatedParent}}"
                    HitTestVisible="False" Focusable="False"
                    HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
                </Grid>
              </ControlTemplate>
            </Setter.Value>
          </Setter>
        </Style.Setters>
      </Style>
    

    此解决方案不如另一种解决方案令人满意,因为通过从主题复制默认的ComboBox模板,最终会得到一个不跟踪当前Windows主题的应用程序。使用多个ControlTemplates以及StaticResource和一些棘手的绑定可以解决这个问题,但在这一点上我建议只使用adorner和附加属性。