WPF 可编辑组合框验证

2024-03-08

我想要完成的是能够验证输入到可编辑组合框的新类别或从现有组合框的类别列表中选择一个类别。

验证仅适用于 selectedItem,不适用于输入到 Text 的新文本。一旦我添加ValidateOnDataErrors="True"对于 ComboBox 的 Text 属性,输入新文本的事件不会触发。类别是一个带有 Id 和 Name 的简单对象。

XAML:

<Window.Resources>
    <ControlTemplate x:Key="ValidationErrorTamplate">
        <Border BorderBrush="DodgerBlue" BorderThickness="0.75">
            <AdornedElementPlaceholder />
        </Border>
    </ControlTemplate>
    <Style x:Key="ElementInError" TargetType="{x:Type FrameworkElement}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="ToolTip" Value="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<ComboBox Name="CbCategory"
          DisplayMemberPath="Name"
          IsEditable="True"
          ItemsSource="{Binding Categories}"
          SelectedItem="{Binding SelectedCategory,
                                 UpdateSourceTrigger=PropertyChanged,
                                 ValidatesOnDataErrors=True}"
          Style="{StaticResource ElementInError}"
          Text="{Binding NewCategory.Name,
                         UpdateSourceTrigger=PropertyChanged,
                         ValidatesOnDataErrors=True}"
          Validation.ErrorTemplate="{StaticResource ValidationErrorTamplate}" />

视图模型:(: IDataErrorInfo)

    private Category _newCategory;
    private Category _selectedCategory;

    public ExpenseCategory SelectedCategory
    {
       get { return _selectedCategory; }
       set
           {
              if (Equals(_selectedCategory, value)) return;
              _selectedCategory = value;
              SendPropertyChanged("SelectedCategory");
            }
     }
     public ExpenseCategory NewExpenseCategory
     {
        get { return _newExpenseCategory ?? (_newExpenseCategory = new ExpenseCategory()); }
            set
            {
                if (Equals(_newExpenseCategory, value)) return;
                _newExpenseCategory = value;
                SendPropertyChanged("NewExpenseCategory");
            }
        }

public string this[string propertyName]
        {
            get
            {
                switch (propertyName)
                {
                    case "SelectedExpenseCategory":
                    case "NewExpenseCategory":
                        {
                            if ((SelectedCategory == null) || (NewCategory == null)
                            {
                                return "Category must be selected or entered";
                            }
                        }
                        break;
                }
                return string.Empty;
            }

让它工作起来,这可能不是最好的方式,但它可以完成工作。

我基本上做了什么,我将 NewCategory 更改为字符串,而不是 Category 类型的对象。当用户将新值填充到组合框中时,它会根据传递到 NewCategory 构造函数中的值启动一个新的 SelectedCategory。如果我保留对象类型 Category 的 NewCategory 则不起作用。

   public string NewExpenseCategory
    {
        get { return _newExpenseCategory ?? (_newExpenseCategory = ""); }
        set
        {
            if (Equals(_newExpenseCategory, value)) 
                return;
            _newExpenseCategory = value;
            SendPropertyChanged("NewExpenseCategory");
            SelectedExpenseCategory = new ExpenseCategory
                {
                    Name = value
                };
        }
    }

    public string this[string propertyName]
    {
        get
        {
            switch (propertyName)
            {
                case "SelectedExpenseCategory":
                case "NewExpenseCategory":
                    {
                        if ((SelectedExpenseCategory.Name.Length == 0) && (NewExpenseCategory.Length == 0))
                        {
                            return "Category must be selected or entered";
                        }
                    }
                    break;
            }
            return string.Empty;
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF 可编辑组合框验证 的相关文章

  • 如何从 XAML 设置 WPF 用户控件属性?

    我试图从 XAML 设置同一用户控件的多个实例的 fill 属性 以便区分它们 我在控件的 C 代码隐藏中使用依赖属性 并在实例化控件时在 XAML 中引用该属性 这是我尝试过的简化示例 首先是用户控件的 XAML
  • 访问 XAML 中的静态字段

    如何在 xaml 中引用类的静态属性 换句话说 我想做这样的事情 Class BaseThingy public static readonly Style BaseStyle
  • 具有依赖属性的值转换器

    我在实现自定义 DependencyObject 时遇到问题 我需要一个转换器来设置或取消设置绑定属性中的枚举标志 因此 我创建了一个从 FrameworkElement 派生的 IValueConverter 它具有两个 Dependen
  • 依赖属性回调不起作用

    我有以下代码 private static readonly DependencyProperty IDProperty DependencyProperty Register ID typeof int typeof DetailData
  • Spring @Validated 在服务层

    Hej 我想使用 Validated group Foo class 在执行方法之前验证参数的注释 如下所示 public void doFoo Foo Validated groups Foo class foo 当我将此方法放入 Spr
  • Control.Focus() 和 FocusManager.SetFocusedElement() 之间的区别

    从字面上看 我想知道这一点 在某些情况下 Focus 看起来比 SetFocusedElement 更好 但另一种情况 则是逆转 所以我必须知道那里有什么不同的东西 另外 根据 MSDN Focus 用于键盘焦点 SetFocusedEle
  • ListBox.ScrollIntoView() 似乎在 WP7 中不起作用

    每当将新项目添加到项目源时 我想将列表框滚动条移动到底部 但是ScrollIntoView 如果我向它传递对新添加项目的引用或其索引 它似乎不会执行任何操作 有没有人让它工作 或者对如何将列表框向下滚动到底部有任何其他建议 一些代码 voi
  • asp.net mvc jquery 下拉验证

    我如何使用不显眼的 javascript 验证下拉列表 作为所需验证器的验证文本框 但它不适用于下拉列表 需要更改不显眼的 js 文件吗 或者还有其他选项来验证下拉列表吗 我想在我的 javascript 中检查 form validate
  • 从代码访问 WPF 控件验证规则

    XAML
  • 如何在 CAST/CONVERT 之前检查 VARCHAR(n) 的 XML 格式是否正确

    我的公司有一个日志表 其中包含VARCHAR N 放置字符串的列 即supposed是 XML 但事实证明它并不总是格式良好的 为了对日志记录进行分析 以确定错误趋势等 我一直在使用LIKE陈述 然而 这非常慢 最近 我发现SQL Serv
  • 用 C# 编写的带有点击移动的 WPF 游戏

    我试图将标签网格移动到鼠标的位置 就像冒险游戏中的移动一样 理想情况下 我会在途中删除并重新绘制它们 但是 现在我只想弄清楚如何将 int 转换为厚度或 pointtoscreen 到目前为止我有 player XMove int Mous
  • 在 MVVM 中,可以在视图后面的代码中访问 ViewModel 吗?

    在 MVVM 模式中 是否可以接受甚至可以访问视图代码后面的 ViewModel 属性 我有一个可观察的集合 它填充在 ViewModel 中 我需要在视图中使用它来绑定到带有链接列表的无限滚动条 IE private LinkedList
  • 测量 WPF 中的文本

    使用WPF 测量大量短字符串最有效的方法是什么 具体来说 我想确定每个字符串的显示高度 给定统一格式 相同的字体 大小 粗细等 以及字符串可能占用的最大宽度 最低级的技术 因此为创意优化提供了最大的空间 是使用 GlyphRuns 它没有很
  • Codeigniter PHP - 在锚点加载视图

    我在一个长页面的底部有一个表单 如果用户填写了表单但它不验证页面是否以典型的 codeigniter 方式重新加载 this gt load gt view template data 然而 由于表单位于页面底部 我需要将页面加载到那里 就
  • WPF:动画不流畅

    我正在制作一个动画TextBlock 60秒后增加FontSize从 8 点到 200 点 一切工作正常 除了我的动画随着文本的增长而上下移动 为什么会发生这种情况 是否可以避免这种情况 我有一个非常简单的 XAML 文件
  • 以编程方式绑定 WPF 中的附加属性

    我在用着杰森 坎普很酷CueBanner class http www ageektrapped com blog the missing net 4 cue banner in wpf i mean watermark in wpf 对于
  • 强制 protobuf-net 忽略 IEnumerable/ICollection 接口

    如何让 protobuf net v2 忽略我的类实现 ICollection IEnumerable 等的事实 对于这个特定场景 我只希望序列化标记为 ProtoMember 的字段 我目前正在从使用 protobuf net v1 转换
  • 通过 RDP 使用 WPF 的 Direct2d

    我正在开发一个 C 应用程序 它使用 SharpDx 通过 Direct2d 渲染地图 该地图与 D3DImage 一起显示在 WPF 主机上 在本地计算机上 一切正常 但当我尝试通过远程桌面连接时 D3DImage 会丢失其后备缓冲区 并
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • 如何检查用户电子邮件的唯一性并将结果传递给 jQuery?

    我有这个问题 我正在控制器中检查用户电子邮件并发送 json 成功响应 如果已获取 并添加输入的 css 样式 我还需要阻止提交并添加一些消息 这是我的检查电子邮件操作 使用本文 http paydrotalks com posts 45

随机推荐