自定义封装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>

浙公网安备 33010602011771号