自定义封装MVVM

 

WPF 本身是支持MVVM模式,但是在使用之前一般都会自定义封装一下

 

1 封装通知类

  /// <summary>
    /// 通知基类  ViewMode 继续这个
    /// </summary>
    public class C_NotifiBase : INotifyPropertyChanged
    {

        /// <summary>
        /// 错误信息
        /// </summary>
        public string ErrMsg =string.Empty; 

        public event PropertyChangedEventHandler PropertyChanged;
        /// <summary>
        /// 子类直接调用该方法,如果一个属性改变需要通知多个的时候就需要显示调用通知,
        /// 如果单个属性就可以不用传递参数,直接获取调用的属性
        /// </summary>
        /// <param name="propertyName"></param>
        public void Change([CallerMemberName] string propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public C_NotifiBase()
        {
            InitICommand();
            InitParam();
        }

        /// <summary>
        /// 子类始化命令,子窗口重写该方法
        /// </summary>
        public virtual void InitICommand()
        {

        }
        /// <summary>
        /// 初始化参数
        /// </summary>
        public virtual void InitParam()
        {

        }
    }

2 封装事件Command类

  /// <summary>
    /// 事件基类 一般作为属性放在 C_NotifiBase 里面
    /// </summary>
    public class C_CommandBase : ICommand
    {
        /// <summary>
        /// 要执行的委托动作
        /// </summary>
        Action<object> mExectuActon;
        /// <summary>
        /// 取消
        /// </summary>
        Func<bool> mCanExecute;
        public event EventHandler CanExecuteChanged;
        public C_CommandBase(Action<object> action) : this(action, null)
        {

        }
        public C_CommandBase(Action<object> action, Func<bool> cancel)
        {
            mExectuActon = action;
            mCanExecute = cancel;
        }
        public bool CanExecute(object parameter)
        {
            if (mCanExecute != null)
            {
                return mCanExecute.Invoke();
            }
            return true;
        }

        /// <summary>
        /// 执行事件
        /// </summary>
        /// <param name="parameter"></param>
        public void Execute(object parameter)
        {
            mExectuActon(parameter);
        }
        public void RaiseCanExecuteChanged()
        {
            if (CanExecuteChanged != null)
            {
                CanExecuteChanged.Invoke(this, EventArgs.Empty);
            }
        }
    }

3  使用

   3.1、新建一个VIewModel  类

    /// <summary>
    /// 配置实体
    /// </summary>
    public class C_ConfigViewModel: C_NotifiBase
    {
        public ICommand SaveClick { get;set ; }

        /// <summary>
        /// 参数列表
        /// </summary>
        private ObservableCollection<C_ConfigModel<object>> mParamList = new ObservableCollection<C_ConfigModel<object>>();
        /// <summary>
        /// 参数列表
        /// </summary>
        public ObservableCollection<C_ConfigModel<object>> ParamList
        {
            get { return mParamList; }
            set { mParamList = value; Change(); }
        }

  3.2  新建一个页面,并设置页面的上下文数据,在后台构造函数中设置

 /// <summary>
    /// wConfig.xaml 的交互逻辑
    /// </summary>
    public partial class wConfig : wBase
    {
        public wConfig(C_BLEContextService ogeTaskItemService )
        {
            InitializeComponent();
            this.DataContext = new C_ConfigViewModel(ogeTaskItemService) ;
            IsCloseButtonVisible = Visibility.Visible;
            WindowTitle = Title;
        }

  前台页面直接使用

   <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="60"/>
        </Grid.RowDefinitions>

        <DataGrid ColumnWidth="*"  CanUserAddRows="False"   AutoGenerateColumns="False" 
                  ItemsSource="{Binding ParamList }"  >
            <DataGrid.Columns>
                <DataGridTextColumn Header="参数名字"  Binding="{Binding  ConfigName}" IsReadOnly="True" FontSize="15"/>
                <DataGridTextColumn Header="参数值"  Binding="{Binding  ConfigValue}" />
                <DataGridTextColumn Header="参数说明"  Binding="{Binding  ConfigRemark}" />
            </DataGrid.Columns>
        </DataGrid>

        <Button Grid.Row="1"   Content="保存参数" Command="{Binding SaveClick}"  FontSize="30"  Height="45" 
                Template="{StaticResource btnBlueAllBulue}" Margin="10"  />
    </Grid>
posted @ 2024-08-20 15:17  陌念  阅读(16)  评论(0)    收藏  举报