关于WPF使用MultiConverter控制Button状态的详细介绍

需求描述
1.按钮的状态需要根据多个数据源的内容作出不同的组合判断
2.每个数据源的判断规则可定制
注:以下功能感觉只是简单粗暴的实现,如果您了解更优雅的解决方案,烦请告诉我下,感谢先!

按钮XAML


代码如下:

<Button Name="btnOK"
                 Grid.Column="2"
                 HorizontalAlignment="Left"
                 VerticalAlignment="Center"
                 Command="{Binding Path=OKCommand}"
                 Content="{DynamicResource Common_Button_OK}"
                 IsDefault="True"
                 Style="{DynamicResource ButtonStyle}">
           <Button.IsEnabled>
             <MultiBinding Converter="{StaticResource InvalidMultiValidationRuleToBooleanMultiConverter}"
               ConverterParameter="objectnull|greaterthanzerointeger|greaterthanzerointeger|greaterthanzerointeger">
               <Binding ElementName="comboBoxFilter"
                        Mode="OneWay"
                        Path="SelectedItem" />
               <Binding ElementName="textBoxFrameRate"
                        Mode="OneWay"
                        Path="Text" />
               <Binding ElementName="textBoxSizeWidth"
                        Mode="OneWay"
                        Path="Text" />
               <Binding ElementName="textBoxSizeHeight"
                        Mode="OneWay"
                        Path="Text" />
             </MultiBinding>
           </Button.IsEnabled>
         </Button>

MultiConverter判断


代码如下:

public class InvalidMultiValidationRuleToBooleanMultiConverter : IMultiValueConverter
  {
    #region IMultiValueConverter Members

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
      string[] paramlist = ((string)parameter).Split('|');
      if (paramlist == null || paramlist.Length <= 0)
      {
        throw new ArgumentNullException("parameter");
      }
      int length = paramlist.Length;

IList<bool> boollist = new List<bool>();

for (int i = 0; i < paramlist.Length; i++)
      {
        switch (paramlist[i].ToLowerInvariant())
        {
          case "checknameexisted":
            boollist.Add(ValidationRuleHelper.Validate<InvalidCheckNameExistedValidationRule>(values[i]));
            break;
          case "directoryandfileexist":
            boollist.Add(ValidationRuleHelper.Validate<InvalidDirectoryAndFileExistValidationRule>(values[i]));
            break;
          case "greaterthanzerointeger":
            boollist.Add(ValidationRuleHelper.Validate<InvalidGreaterThanZeroIntegerValidationRule>(values[i]));
            break;
          case "numericnull":
            boollist.Add(ValidationRuleHelper.Validate<InvalidNumericNullValidationRule>(values[i]));
            break;
          case "stringlength":
            boollist.Add(ValidationRuleHelper.Validate<InvalidStringLengthValidationRule>(values[i]));
            break;
          case "stringnullorempty":
            boollist.Add(ValidationRuleHelper.Validate<InvalidStringNullOrEmptyValidationRule>(values[i]));
            break;
          case "ipaddress":
            boollist.Add(ValidationRuleHelper.Validate<InvalidIPAddressValidationRule>(values[i]));
            break;
          case "objectnull":
          default:
            boollist.Add(ValidationRuleHelper.Validate<InvalidObjectNullValidationRule>(values[i]));
            break;
        }
      }

bool result = boollist[0];
      for (int i = 1; i < boollist.Count; i++)
      {
        result = result & boollist[i];
      }

return result;
    }

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

#endregion
  }

(0)

相关推荐

  • 在WinForm和WPF中使用GMap.Net地图插件简单教程

    如何在WinForm中使用GMap.Net 项目主页:https://greatmaps.codeplex.com/ 下载GMap.Net,我下载的版本:greatmaps_81b71bf30091,编译三个核心项目: GMap.Net.Core:核心DLL GMap.Net.WindowsForms:WinForm中使用的DLL GMap.NET.WindowsPresentation:WPF中使用的DLL 在WinForm项目中使用GMap: 1.新建一个Visual C# 的Windows

  • WPF制作一个简单的倒计时器实例附源码

    实例一: 早上起来后闲的无事,于是想到前些日子学院的某个老师让大家给他找个什么倒计时的小软件,当时大家忙于复习所以也懒得搭理这件事,囧~.既然早上没事干,何不写个玩玩~既然要写,就用以前没怎么捣鼓过的WPF写一个吧,也算是一次学习WPF的初探吧(感觉自己很落后了)! 在Vs2008和Vs2010之间徘徊了许久之后,最终还是选择了Vs2008做开发IDE.在Vs2008中建了个WPF工程后,浏览了下默认生成的工程文件结构,一个App.xaml(当然还有App.xaml.cs)和一个Windows1

  • WPF绑定实例详解

    本文详细讲述了WPF绑定的用法,分享给大家供大家参考.具体用法分析如下: 1.WPF绑定使用的源属性必须是依赖项属性,这是因为依赖项属性具有内置的更改通知支持,元素绑定表达式使用了Xaml扩展标记,WPF绑定一个控件是使用Binding.ElementName,绑定非控件对象时使用Source,RelativeSource,DataContext属性(WPF特有,而非XAML),只能绑定对象的共有字段. 下边是部分Binding 属性名,完整列表参考 :http://msdn.microsoft

  • 深入分析WPF客户端读取高清图片卡以及缩略图的解决方法详解

    在Ftp上传上,有人上传了高清图片,每张图片大约2M.如果使用传统的BitmapImage类,然后绑定 Source 属性的方法,有些电脑在首次会比较卡,一张电脑10秒,4张大约会卡40秒. 所以我先异步的下载图片,得到downloadFileStream对象,然后绑定到BitmapImage类上.例如:System.Windows.Controls.Image photo = new Image{    Width = 100,    Height = 100,    Margin = new

  • 关于WPF异步MVVM等待窗体的介绍

    需求描述•在ViewModel中处理Model中的数据需要一定时间的等待•ViewModel或Model在获取数据或访问同步服务时有一定延迟需要等待•ViewModel操作View加载数据需要一段时间解决办法•显示一个等待UI,当数据处理完毕或服务接口返回后等待UI消失转动齿轮控件•参考开源实现SprocketControl :http://wpfspark.codeplex.com/等待控件 复制代码 代码如下: <Grid>     <local:SprocketControl Gr

  • WPF的数据绑定详细介绍

    一.WPF数据绑定的概要 数据绑定:是应用程序 UI 与业务逻辑之间建立连接的过程. 如果绑定正确设置并且数据提供正确通知,则当数据的值发生更改时,绑定到数据的视觉元素会自动反映更改. 数据绑定可能还意味着如果视觉元素中数据的外部表现形式发生更改,则基础数据可以自动更新以反映更改. 例如:如果用户编辑 TextBox 元素中的值,则基础数据值会自动更新以反映该更改. 1. 数据绑定涉及到两个方面: 一个是绑定源,一个是绑定目标.绑定源即控件绑定所使用的源数据,绑定目标即数据显示的控件. 2. 对

  • 解析WPF绑定层次结构数据的应用详解

    在实际项目应用中会存在多种类型的层次结构数据,WPF提供了良好的数据绑定机制.其中运用最频繁的就是ListBox和TreeView控件. 一.ListBox和TreeView控件的区别1.ListBox显示单层次数据集合,TreeView可以显示单层次和多层次数据集合:2.通过ListBox在UI层面可以展示良好的数据显示效果,对数据集合可以进行排序.分组.过滤操作:3.TreeView显示为一个多层次的数据集合为树形结构,通过Templete和Style属性同样可以为其定义良好的数据显示效果:

  • 在Winform和WPF中注册全局快捷键实现思路及代码

    快捷键辅助类 复制代码 代码如下: class HotKey { /// <summary> /// 如果函数执行成功,返回值不为0. /// 如果函数执行失败,返回值为0.要得到扩展错误信息,调用GetLastError..NET方法:Marshal.GetLastWin32Error() /// </summary> /// <param name="hWnd">要定义热键的窗口的句柄</param> /// <param na

  • 用WPF实现屏幕文字提示的实现方法

    1. 新建一个WPF Application.2. 将Window的WindowStyle属性设置为"None"去掉标题栏,将AllowsTransparency属性设置为"True"允许透明,Topmost属性设置为"True"使提示文字显示在顶层,Background属性设置为"#00000000"使窗口透明.3. 设置Grid的Background属性.如显示黑色文字提示,可使用半透明白色背景.透明的效果如果由Opaci

  • 解析WPF实现音频文件循环顺序播放的解决方法

    要做基于WPF的音频文件循环顺序播放首先要了解WPF下有哪些类是用于控制音频的. WPF下主要有两个音频控制的类,这里做下比较: 1.SoundPlayer 2.MediaPlayer 派生MediaElement 一.SoundPlayer类   1.基于.NET FRAMEWORK 2.0: 2.可播放WAV音频文件: 3.只能播放一个文件,同时播放多个文件会后一个文件的播放操作会终止前一个播放的文件: 4.不能对音量进行控制:二.MediaPlayer类 1.基于WPF: 2.支持多种音频

  • wpf将表中数据显示到datagrid示例

    a.在.xaml文件中拖入一个datagrid,然后添加列名,使用Binding="{Binding 数据库中的列名称}",如下:  复制代码 代码如下: <DataGrid AutoGenerateColumns="False" Height="438"HorizontalAlignment="Left" Margin="23,278,0,0" Name="dataGrid1" 

随机推荐