wpf - 验证 - 如何显示工具提示并禁用“运行”按钮

2023-11-30

你好 我需要验证应用程序中的一些文本框。我决定使用验证规则 “数据错误验证规则”。这就是为什么在我的类中我实现了 IDataErrorInfo 接口并编写了适当的函数。在我的 xaml 代码中,我向文本框添加了绑定和验证规则

 <TextBox x:Name="txtName" Grid.Column="3" Grid.Row="1"  TextAlignment="Center" >
                        <TextBox.Text>
                            <Binding Path="Name" >
                                <Binding.ValidationRules>
                                    <DataErrorValidationRule></DataErrorValidationRule>
                                </Binding.ValidationRules>
                            </Binding>
                        </TextBox.Text>
                    </TextBox>

该文本框的验证正常 - 我的意思是如果数据错误,文本框中会出现红框。然而,我需要做的是在该文本框中显示工具提示,但更重要的是,如果任何文本框有错误的数据,我必须禁用“运行”按钮。最好的方法是什么?

编辑 第一个问题解决了,但我还有另一个问题。我需要使用 MultiBindings 来验证我的按钮。所以我就这么做了

 <Button x:Name="btnArrange"  Grid.Column="0"  Content="Rozmieść" Click="btnArrange_Click" >
                <Button.Style>
                    <Style TargetType="Button">
                        <Style.Triggers>
                            <DataTrigger Value="False">
                                <DataTrigger.Binding>
                                    <MultiBinding Converter="{StaticResource BindingConverter}">
                                        <Binding ElementName="txtName" Path="Validation.HasError" />
                                        <Binding ElementName="txtSurname" Path="Validation.HasError"/>
                                        <Binding ElementName="txtAddress" Path="Validation.HasError"/>

                                    </MultiBinding>
                                </DataTrigger.Binding>
                                <Setter Property="IsEnabled" Value="False"/>

                            </DataTrigger>
                        </Style.Triggers>
                    </Style>        
                </Button.Style>

        </Button>

我的转换器看起来像这样

 public  class Converters : IMultiValueConverter
{

    #region IMultiValueConverter Members

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if(values !=null && values.Length > 0)
        {


            if (values.Cast<type>().Count(val => val) > 0)
                return false;
            return true;
        }
        return false;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }

    #endregion
}

但是我在这个转换器中得到 invalidCastException 。在这种情况下,什么是正确的演员阵容?我认为 HasError 是 bool 类型,所以我应该转换为 bool 类型。


要在工具提示中显示错误消息,请将其放入您的 Application.Resources 中:

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

(示例来自http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.errortemplate.aspx )

要启用/禁用按钮,您可以使用以下内容

<Button x:Name="btnOK" Content="OK" IsDefault="True" Click="btnOK_Click">
  <Button.Style>
    <Style TargetType="{x:Type Button}">
      <Setter Property="IsEnabled" Value="false" />
      <Style.Triggers>
        <MultiDataTrigger>
          <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding ElementName=txt1, Path=(Validation.HasError)}" Value="false" />
            <Condition Binding="{Binding ElementName=txt2, Path=(Validation.HasError)}" Value="false" />
          </MultiDataTrigger.Conditions>
          <Setter Property="IsEnabled" Value="true" />
        </MultiDataTrigger>
      </Style.Triggers>
    </Style>
  </Button.Style>
</Button>

或者您可以实现 ICommand 并使用命令绑定。

EDIT

这是一个完整的工作示例。它显示一个带有两个文本框的窗口。当且仅当两个文本框都非空时,按钮才会启用。创建一个名为 ValidationDemo 的项目并将以下文件放入其中:

主窗口.xaml:

<Window x:Class="ValidationDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="146" Width="223">
  <Window.Resources>
    <Style TargetType="{x:Type TextBox}">
      <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
          <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
        </Trigger>
      </Style.Triggers>
    </Style>
  </Window.Resources>
  <Grid>
    <Label Content="A" Height="28" HorizontalAlignment="Left" Margin="46,7,0,0" Name="label1" VerticalAlignment="Top" />
    <TextBox Name="txtA" Text="{Binding Path=TextA, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" Height="23" HorizontalAlignment="Left" Margin="69,12,0,0" VerticalAlignment="Top" Width="120" />
    <Label Content="B" Height="28" HorizontalAlignment="Left" Margin="46,39,0,0" Name="label2" VerticalAlignment="Top" />
    <TextBox Name="txtB" Text="{Binding Path=TextB, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" Height="23" HorizontalAlignment="Left" Margin="69,41,0,0" VerticalAlignment="Top" Width="120" />
    <Button Name="btnOk" Content="OK" Height="23" HorizontalAlignment="Left" Margin="114,70,0,0" VerticalAlignment="Top" Width="75" Click="btnOk_Click">
      <Button.Style>
        <Style TargetType="{x:Type Button}">
          <Setter Property="IsEnabled" Value="false" />
          <Style.Triggers>
            <MultiDataTrigger>
              <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding ElementName=txtA, Path=(Validation.HasError)}" Value="false" />
                <Condition Binding="{Binding ElementName=txtB, Path=(Validation.HasError)}" Value="false" />
              </MultiDataTrigger.Conditions>
              <Setter Property="IsEnabled" Value="true" />
            </MultiDataTrigger>
          </Style.Triggers>
        </Style>
      </Button.Style>
    </Button>
  </Grid>
</Window>

MainWindow.xaml.cs:

using System.Windows;

namespace ValidationDemo
{
  /// <summary>
  /// Interaction logic for MainWindow.xaml
  /// </summary>
  public partial class MainWindow : Window
  {

    private Model model = new Model();

    public MainWindow()
    {
      InitializeComponent();
      this.DataContext = this.model;
    }

    private void btnOk_Click(object sender, RoutedEventArgs e)
    {
      Application.Current.Shutdown();
    }
  }
}

模型.cs:

using System;
using System.ComponentModel;

namespace ValidationDemo
{
  public class Model : INotifyPropertyChanged, IDataErrorInfo
  {
    public event PropertyChangedEventHandler PropertyChanged;

    private string textA = string.Empty;
    public string TextA
    {
      get
      {
        return this.textA;
      }
      set
      {
        if (this.textA != value)
        {
          this.textA = value;
          this.OnPropertyChanged("TextA");
        }
      }
    }

    private string textB = string.Empty;
    public string TextB
    {
      get
      {
        return this.textB;
      }
      set
      {
        if (this.textB != value)
        {
          this.textB = value;
          this.OnPropertyChanged("TextB");
        }
      }
    }

    public string Error
    {
      get { throw new NotImplementedException(); }
    }

    public string this[string columnName]
    {
      get
      {
        string result = string.Empty;
        switch (columnName)
        {
          case "TextA":
            if (string.IsNullOrEmpty(this.textA))
            {
              result = "'A' must not be empty";
            }
            break;
          case "TextB":
            if (string.IsNullOrEmpty(this.textA))
            {
              result = "'B' must not be empty";
            }
            break;
        }
        return result;
      }
    }

    protected virtual void OnPropertyChanged(string propertyName)
    {
      if (this.PropertyChanged != null)
      {
        this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
      }
    }

  }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wpf - 验证 - 如何显示工具提示并禁用“运行”按钮 的相关文章

  • 将字符串数组添加到组合框

    我有一个组合框 我想加载一个从方法返回的字符串数组 我目前只是用 for 循环加载它 但我认为应该可以将字符串数组直接分配给组合框 我只是想改进我的代码 我已经做了一些搜索 并且看到了使用数据范围或数据源的答案 但这些似乎都不起作用 我也尝
  • WPF DataGrid 的 Items 和 ItemsSource 属性之间有什么区别?

    从我从 Intellisense 收集到的信息来看 区别在于返回类型 并且 ItemsSource 有一个 setter 而 Items 只有一个 getter 但实际上 我不明白这两个属性需要彼此分开 而不仅仅是作为一个属性 有人可以向我
  • 表单帖子上的 asp.net mvc 编码

    我在我的 asp net mvc 表单 带有文本区域的 nicedit 中使用富文本编辑器 当我在帖子上提交表单时 因为它不是 html 编码的 我收到以下消息 从客户端检测到潜在危险的 Request Form 值 如何对 post 上的
  • 如何在 XAML 和 C# 中将字符串列表显示为 DataGrid(表)

    我已经在 SO 上潜伏了很长时间 直到最近才决定建立一个帐户 我花了很多时间试图解决这个我一直没有询问的问题 但我就在这里 我正在努力实现的目标 我有一个字符串列表 例如 Mango Banana Melon 我们称之为水果 我想将其显示为
  • F# 中的自定义路由事件

    我正在尝试翻译这段 C 代码 https msdn microsoft com en us library ms752288 aspx 到目前为止我的尝试 type MyButtonSimple as self inherit Button
  • wpf 控件宽度绑定

    我有两个带有内容的边框 第二个边框宽度根据情况而变化 在内容上 我试图将第一个边框绑定到第二个边框宽度 但是 它不起作用 我不确定我错过了什么 有人可以给我一些指导吗 下面是我目前正在尝试的示例
  • XAML WPF 如何在 FlowDocument 上添加内嵌背景图像?

    下面的代码是给Flow Document添加背景图片
  • WPF - 是否必须处置 HwndSource?

    我在用着HwndSource在非主窗口的 WPF 窗口中 为了挂钩窗口过程 WndProc 来接收一些消息 WinSource HwndSource FromHwnd new WindowInteropHelper this Handle
  • codeigniter 动态表单输入名称的表单验证

    我有一个 codeigniter 应用程序 我的视图使用数据库行 ID 附加到输入名称以获取唯一 ID 这允许我在表单操作 即更新 中使用所有输入 我的视图语法 table tr th nbsp th th nbsp th th Custo
  • 如何从 WPF 应用程序访问 Windows 文件预览图标

    我在一个目录中有一堆图片和视频 需要在WPF应用程序中显示 我正在考虑将Win7大图标本身显示为预览图像 因为这将节省我从视频文件中抓取适当帧的工作 因为 Windows 已经很好地完成了这项工作 有任何代码片段可以访问此 Shell 图标
  • WPF Datagrid 组扩展文本 - 如何绑定?

    我正在使用带有组合框的数据网格 该组合框应该更改分组字段 我使用以下 xaml 来定义常规分组模板
  • Java Spring Rest 验证配置属性访问

    我有一个 Spring JSON RestAPI 它使用注释驱动的输入验证 Valid 当我尝试验证另一个对象内的对象时 出现以下错误 java lang IllegalStateException JSR 303 validated pr
  • 将 MouseBindings 添加到数据绑定 WPF ListView 中的项目

    我试图在用户单击 ListView 中的项目时执行 ViewModel 中的命令 当我添加一个ListViewItem在 XAML 中我可以添加一个MouseBinding to its InputBindings
  • 无法在 WPF 中使用 MVVM 在设计时进行数据绑定 - ViewModel 属性永远不会被调用

    好吧 我正在为此烦恼 所以任何帮助将不胜感激 我正在使用 MVVM 模式构建 WPF 应用程序 为了在设计时获取数据 我将 Ninject 依赖注入框架与服务定位器结合使用 很像文章中的示例 http jonas follesoe no Y
  • 使用 XAML 文件作为矢量图像源

    我希望能够使用矢量图形 最好在 XAML 中定义 作为图像控件的源 就像我当前可以使用 PNG 等光栅图像一样 这样我就可以轻松地混合和匹配位图和矢量图像 如下所示
  • 捕获多点触摸屏上的双击触摸

    我发布了另一个问题 如何通过监视 TouchDown 事件的触摸之间的时间跨度来 手动 捕获双击 但它有很多问题 有谁知道在多点触摸屏上捕获双击的标准 Microsoft 方式 事件 多谢 Dan 我检查了点击位置和秒表的组合 效果非常完美
  • 当 DataTable 为空时,DataGrid 显示空行

    我有一个DataGrid dg1 绑定到DataTable 数据集 表 代码运行良好并且DataGrid正在显示数据DataTable正确 但是 如果我Clear the DataTable the DataGrid也很清楚 但留下一个空行
  • 如何知道 WPF 中的控件(或窗口)何时被渲染(绘制)?

    我需要将窗口的内容存储到图像中 保存并关闭窗口 如果我在 加载 事件上关闭窗口 则图像包含窗口 其中某些项目绘制正常 其他一些项目仅绘制了一半或扭曲 而其他项目则不在图像上 如果我设置一个计时器并在一定时间后关闭窗口 250 毫秒到 1 秒
  • WPF XAML 定义的 MenuItem 重用开始工作,然后消失

    以下简单代码尝试在两个单独的菜单上重用 Window Resources 中定义的 MenuItem
  • WPF 和 ClickOnce

    MSDN 未将 WPF exe 列为 ClickOnce 支持的应用程序类型 ClickOnce 应用程序是任何 Windows Presentation Foundation xbap Windows 窗体 exe 控制台应用程序 exe

随机推荐

  • 用于 CGM(计算机图形图元文件)格式的 .NET 或 C# 库?

    有谁知道用于在 WinForms 和 Microsoft Service Reports CrystalReports 中显示 CGM 文件以便也可以打印的 NET C 库 如果它还能够将文件转换为网络友好的图形格式 如 jpeg gif
  • C# 合并运算符

    为什么下面的代码返回 false public static void Main bool someCondition true bool someConditionOverride false bool result someCondit
  • 在 Android 上将 UTC 转换为本地时间

    在我的项目中 我获得了 json 格式的 API 响应 我得到一个 UTC 时间格式的时间字符串值 如下所示Jul 16 2013 12 08 59 AM 我需要将其更改为当地时间 这就是我们使用此应用程序时需要显示当地时间的地方 我该如何
  • 如何确保修改 .h 文件时,包含该文件的 .cc 文件会在使用 Visual Studio 2008 的发布版本中自动编译?

    假设我的 Visual Studio 2008 项目中有 a h a cc 和 b cc a cc 和 b cc 都包含 a h 当我修改 a h 并构建项目时 a cc 和 b cc 在调试版本中进行编译 然而 在发布版本中情况并非如此
  • 虚函数效率和“final”关键字

    考虑一个有类的程序Foo包含一个函数Foo fn声明如下 virtual void fn 和一个子类Foo called Bar 将会声明Bar fn像这样 virtual void fn override final 导致呼叫fn in
  • 找不到导入tuneup.js文件

    使用 Xcode iOS Instruments UI Automationtunup js javascript 库https github com alexvollmer tuneup js 我在理解我启动的仪器的当前工作目录方面遇到了
  • 更新自定义字段结束于无限循环

    我在 AR 发票和备忘录 屏幕 ID AR301000 中有一个对应 AP 参考的自定义字段 Nbr 在类似的管理器中 AP 账单和调整 屏幕 ID AP301000 中的另一个自定义字段对应于相应的 AR 参考 Nbr 我正在尝试更新 A
  • 如何在 C# 中从数据库检索时将 varBinary 转换为图像或视频

    我正在使用 Visual Studio 2010 桌面应用程序 并使用 LINQ to SQL 将图像 视频或音频文件保存到 dataType 中的数据库VarBinary MAX 我可以做到这一点 问题是 我无法获取它们并在 xaml 中
  • 使用VBS下载文件

    我有一个 VBS 脚本 可以生成一个 URL 以从网络上的服务器下载文件 我现在需要将文件下载到 C rWallpaper wallpaper png URL 存储在变量中 url 我希望它能像 Linux 上的 wget 一样工作 只需下
  • JVM的LookupSwitch和TableSwitch有什么区别?

    我很难理解 Java 字节码中的 LookUpSwitch 和 TableSwitch 如果我理解得好的话 LookUpSwitch 和 TableSwitch 都对应于switchJava 源代码声明 为什么一条 JAVA 语句会生成 2
  • 为什么这里没有生成 Coredump 文件?

    我这里遇到一种情况 几天前我能够在目标板上看到核心转储文件 我通过在 etc profile 中添加 ulimit c unlimited 来启用核心转储生成 但后来有人告诉我 这会only对从登录 shell 启动的程序有效 对由以下命令
  • Hibernate 拦截器 - 加载事件之后

    实体加载后是否发生任何事件 我的目标是将这个实体添加到 Solr 或 Lucene 索引中 EmptyInterceptor OnLoad 事件发生在对象初始化之前 我想在设置对象属性后处理事件 是否可以使用 Hibernate 拦截器或其
  • Java - 使用 catch 块内的方法返回语句并引发异常?

    我有以下代码 使用 hibernate 在错误时引发自定义异常 并且我还想在这种情况下关闭会话 因为除非在客户端计算机上接收到 否则不会捕获异常 public
  • 如何将 Google 表格文件转换为 Excel 文件 (XLSX)

    The image shows the code who is updated var xlsFile 未定义 为什么 如何使用 Google Sheets 脚本编辑器将 Google Sheets 文件转换为 Excel 文件 funct
  • 无效签名错误!

    我正在尝试更新我的应用程序 但上传二进制文件后 Itunes connect 向我发送了以下电子邮件 尊敬的开发者 感谢您的 最近提交的 我的应用程序 的二进制文件 到应用商店 不幸的是我们 发现您的二进制文件存在问题 您需要按顺序更正 以
  • SVG 中的单击事件坐标

    该 HTML 包含 SVG div class container div class spacer div div
  • 使用 grep 获取每行匹配后的下一个 WORD

    我想得到 GET 来自我的服务器日志的查询 例如 这是服务器日志 1 0 0 127 in addr arpa 10 Jun 2012 15 32 27 code 404 message File not fo 1 0 0 127 in a
  • Emacs:如何绑定敲击两次的键?

    我正在使用 Emacs 23 并且我正在绑定C 功能的组合键 global set key kbd C myfunction 是否可以绑定快速 双击 按键 例如我想调用一个函数myfunction打字时 很快两次 没有任何内置内容 但您可以
  • 在 QtableView 中添加复选框作为垂直标题

    我试图拥有一个 QTableView 复选框 因此我可以使用它们进行行选择 我已经设法做到了这一点 现在我希望标题本身成为复选框 以便我可以选中 取消选中 All 或 any row 我已经找了好几天了 但没能做到 我尝试对模型使用 set
  • wpf - 验证 - 如何显示工具提示并禁用“运行”按钮

    你好 我需要验证应用程序中的一些文本框 我决定使用验证规则 数据错误验证规则 这就是为什么在我的类中我实现了 IDataErrorInfo 接口并编写了适当的函数 在我的 xaml 代码中 我向文本框添加了绑定和验证规则