为了节省开发时间,在事件绑定上使用了Prism框架,OPC通信方面使用了OPCDAAuto.dll类库,二者均可以通过Nuget方式安装到项目中。

  • 定义了一个DelegateCommand类用来处理属性和命令;
  • 定义了一个NotificationObject类用来通知属性和命令的改变;
  • 注意:在使用事件绑定时,需要添加引用 xmlns:i="http://schemas.microsoft.com/xaml/behaviors",然后根据控件对应事件的名称设置绑定命令即可。

    比如我们想给ComboBox的SelectionChanged事件设置一个事件绑定,可这么写

    xaml代码:

    <ComboBox
        x:Name="CombServerList"
        Width="120"
        Margin="{StaticResource ControlMargin}"
        ItemsSource="{Binding ServerList}">
        <!--  事件绑定  -->
        <i:Interaction.Triggers>
              <i:EventTrigger EventName="SelectionChanged">
                 <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding ElementName=CombServerList}" />
              </i:EventTrigger>
         </i:Interaction.Triggers>
    </ComboBox>
    View Code

    VM代码:

            public ICommand SelectionChangedCommand
                    return new Prism.Commands.DelegateCommand<ComboBox>((combobox) =>
                       // 业务逻辑
    View Code
    

    相关类的定义代码如下:

     public class DelegateCommand : ICommand
            public event EventHandler CanExecuteChanged;
            /// <summary>
            /// 判断判断命令是否可以被执行
            /// </summary>
            /// <param name="parameter"></param>
            /// <returns></returns>
            public bool CanExecute(object parameter)
                if (this.CanExecuteFunc != null)
                    this.CanExecuteFunc(parameter);
                    return true;
                return false;
            /// <summary>
            /// 执行相关的函数或者命令
            /// </summary>
            /// <param name="parameter"></param>
            public void Execute(object parameter)
                if (this.ExecuteAction != null)
                    this.ExecuteAction(parameter);
                    return;
            /// <summary>
            /// 声明一个委托用来执行命令对应的方法
            /// </summary>
            public Action<object> ExecuteAction { get; set; }
            /// <summary>
            /// 声明一个方法,用来判断命令是否可以被执行
            /// </summary>
            public Func<object, bool> CanExecuteFunc { get; set; }
    DelegateCommand 
    
    public class NotificationObject : INotifyPropertyChanged
            /// <summary>
            /// 实现接口
            /// </summary>
            public event PropertyChangedEventHandler PropertyChanged;
            /// <summary>
            /// 通知属性的改变
            /// </summary>
            /// <param name="propertyName"></param>
            public void RaisePropertyChanged(string propertyName)
                if (this.PropertyChanged != null)
                    this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
    NotificationObject
    

    UI界面搭建

    这里主要采用第三方开源框架MahApps.Metro,可以通过NuGet方式安装到项目中,这里不再展开讲解,感兴趣的朋友可以参考 MahApps.Metro - Quick Start

    OPC相关处理

    大致分为如下几步:

  • 获取OPC服务列表
  • 连接OPC服务
  • 获取项目列表
  • 添加项目到分组中
  • 对项目的内容进行读写操作
  • 比较简单,不再展开了。

    这里我们说一说登陆界面的实现,由于追求PURE MVVM,所以这里有三点需要说明一下:

  • PasswordBox绑定
  • 登陆窗体切换
  • PasswordBox绑定:自定义帮助类,使用PasswordBoxBehavior实现绑定;

    圆形头像:自定义样式,增加Image圆角属性;

    登陆窗体切换:借助prism的shell。

    至此,已全部结束。

      作者:Jeremy.Wu
      出处:https://www.cnblogs.com/jeremywucnblog/
      本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。