XAML ReadOnly ComboBox

时间:2011-02-03 02:47:34

标签: wpf xaml combobox readonly

要在XAML(WPF)中设置ReadOnly ComboBox,您必须根据一对属性设置ComboBoxTextBox只显示其中一个属性{{您IsReadOnly必须存在的1}} / IsEditable。请注意,在此示例中,“ViewModel”必须存在于资源中,它应该是UserNVL集合,允许我们将NameValueList转换为名称。在这种情况下,ID是用户名的键。另请注意,RecipientID也必须存在于资源中,并且是标准VisibilityConverter

                                                                               

天!这很难找到,我必须自己做。这允许用户选择文本框的内容。禁用BooleanToVisibilityConverter绝对不允许你这样做。

6 个答案:

答案 0 :(得分:5)

有两个名为IsHitTestVisible& IsTabVisible。前者使控制耳聋的鼠标事件和后者的键盘事件。 这可以帮助你,因为它不会给你的组合框提供禁用的外观,但你将成功制作一个只读的组合框.. 资源 :- http://www.telerik.com/community/forums/wpf/combobox/isreadonly-does-seem-to-work.aspx

答案 1 :(得分:3)

<DockPanel>
  <TextBlock Text="Recipient" Margin="6,9,3,6" HorizontalAlignment="Right"/>
  <ComboBox
      x:Name="RecipientID"
      ItemsSource="{Binding Source={StaticResource UserNVL}}"
      DisplayMemberPath="Value"
      SelectedValuePath="Key"
      SelectedValue="{Binding Path=RecipientID}"
      Height="20"
      Margin="6,6,0,6"
      MinWidth="200"
      HorizontalAlignment="Left"
      IsEditable ="True"
      Visibility="{Binding Path=IsEditable, Converter={StaticResource VisibilityConverter}}"/>
  <TextBox
      x:Name="RecipientName"
      Text="{Binding ElementName=RecipientID, Path=Text}"
      Margin="6,6,0,6"
      MinWidth="200"
      HorizontalAlignment="Left"
      Style="{StaticResource textBoxInError}"
      Visibility="{Binding Path=IsReadOnly, Converter={StaticResource VisibilityConverter}}"/>
</DockPanel>

答案 2 :(得分:1)

为什么不设置IsEnabled = false?

答案 3 :(得分:1)

如果IsEnabled设置为false,则Combobox值几乎不可读。我发现合适的解决方案是:

  • 组合框和文本框(格式化为只读)处于相同的网格位置
  • 组合框跨越到下一列以获得额外的15宽度,因此可以看到下拉按钮
  • textbox.IsVisible绑定到combobox.IsEnabled with bool to visibility converter。
  • textbox.Text绑定到combobox.SelectedItem(在我的情况下,它是强类型的,所以我实际上绑定到它的.DisplayText)

答案 4 :(得分:1)

我认为你会发现创建一个以这种非常简单的方式扩展ComboBox类的类更容易和实用:

  1. 覆盖Combobox的OnSelectionChanged方法以检查属性IsReadOnly,以允许base.OnSelectionChanged(e)运行。
  2. 这样你只需将ComboBox.IsReadOnly属性设置为True即可。没有大的XAML可以随处写...

答案 5 :(得分:0)

这是一个自定义的 ComboBox 子类,它提供了我的场景所需的只读行为:

public class ReadOnlyComboBox : ComboBox
{
    static ReadOnlyComboBox()
    {
        IsDropDownOpenProperty.OverrideMetadata(typeof(ReadOnlyComboBox), new FrameworkPropertyMetadata(
            propertyChangedCallback: delegate { },
            coerceValueCallback: (d, value) =>
            {
                if (((ReadOnlyComboBox)d).IsReadOnly)
                {
                    // Prohibit opening the drop down when read only.
                    return false;
                }

                return value;
            }));

        IsReadOnlyProperty.OverrideMetadata(typeof(ReadOnlyComboBox), new FrameworkPropertyMetadata(
            propertyChangedCallback: (d, e) =>
            {
                // When setting "read only" to false, close the drop down.
                if (e.NewValue is true)
                {
                    ((ReadOnlyComboBox)d).IsDropDownOpen = false;
                }
            }));
    }

    protected override void OnSelectionChanged(SelectionChangedEventArgs e)
    {
        if (IsReadOnly)
        {
            // Disallow changing the selection when read only.
            e.Handled = true;
            return;
        }

        base.OnSelectionChanged(e);
    }
}

关于这种方法的要点:

  • 不会破坏应用于元素的任何现有样式,这与引入额外 UI 元素的方法不同。
  • 只读时不会中断输入焦点。您仍然可以使用 Tab 键进入并单击以聚焦此元素。这更易于访问,这在我的场景中是一个问题。
  • UI 元素在只读时不会,但默认情况下看起来有任何不同。如果需要,则必须应用相关样式才能实现。