WPF 随记一

本文详细介绍了WPF中的数据驱动和UI驱动原理,重点讲解了DataGrid的筛选、MVVM模式下的数据同步以及TreeView的筛选功能。通过使用CollectionViewSource进行数据筛选和排序,并探讨了命令参数绑定、控件内的子控件访问以及处理DataGrid编辑状态下的视图刷新问题。此外,还提到了在按钮点击事件中避免未加载DLL导致的问题和解决Combobox清空选择的策略。
摘要由CSDN通过智能技术生成

UI驱动程序和数据驱动程序:

  UI驱动:客户通过点击按钮等,然后UI通过消息/事件将命令传递给程序;

数据驱动:WPF通过绑定等方法,在客户点击按钮时通过修改数据,数据的修改触发UI的修改。

在WPF当中, 所有支持绑定的属性本质上它都是封装后的依赖属性。也就是说, 只有依赖属性才可以进行绑定

依赖属性: 当您需要单独创建控件时, 并且希望控件的某个部分能够支持数据绑定时, 你则可以使用到依赖属性。
附加属性: 这种情况很多, 正因为WPF当中并不是所有的内容都支持数据绑定, 但是我们希望其支持数据绑定, 这样我们就可以创建基于自己声明的附加属性,添加到元素上, 让其元素的某个原本不支持数据绑定的属性间接形成绑定关系。

1:DataGrid筛选

 可利用CollectionViewSource进行筛选排序

CollectionViewSource.GetDefaultView(datagrid.ItemsSource).Refresh();获取界面视图并强制刷新,CollectionViewSource的筛选事件(Filter)在视图刷新时触发

datagrid.ItemsSource为资源;

2:MVVM(view-viewmodel-model)模式,同步数据:

   viewmodel和view实现数据同步后,view数据改变触发viewmodel的绑定的属性的Set方法,

(例如 Set{_name=value; if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));)})

可以改为

set{

       _name=value;

    //model.Name=_name; 不建议在此写,初始化会进行多余操作,容易出问题

     if (this.PropertyChanged != null)

       {

            model.Name=_name;//model触发更新时可以对model值进行更新

            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

       }

  }

此时可以达到view-viewmodel-model三者同步更新;

3:TreeView 筛选功能思路:

数据源节点集合A;辅助节点集合B(用于存储不满足过滤条件的节点);

    基于MVVM模式下前后端能数据同步;

筛选按钮点击事件:

    1:将B 添加入A中(确保每次进行筛选时不会漏掉数据),添加完后清空B;

   2: 按过滤条件过滤出不需要的节点存入B,同时A中移除该节点,遍历完A后,A只剩需要的节点,B中储存不满足条件的节点

4:命令参数绑定自身

 CommandParameter="{Binding RelativeSource={x:Static RelativeSource.Self}}

5:命令参数绑定指定按钮

CommandParameter="{Binding  ElementName=checkboxs}"

checkbox为控件名

6:取得控件内控件

 StackPanel 名字为stackpanel,则stackpanel.children为控件子控件,遍历stackpanel.children则可以对需要的控件进行操作

7:按钮点击事件中执行的代码若有主程序中未加载的DLL,有可能会导致按钮无法触发;只需在主程序中初始化一下,将DLL加载进来便可;

8:如果对于DataGrid的某一列内容有类似于Combobox的控件,若出现由于数据原因无法增加一个空数据对Combobox置空,可增加一个按钮,清空当前选中行的Combobox的绑定数据;

方法一:(逻辑:对于datagrid 绑定的数据,对datagrid中的Combobox选中某一数据,就相当于给该行数据赋值,可清空该行数据中对应属性值,由于绑定前后端数据自动同步,前端数据也会自动清空);

方法二:对数据进行包装,将数据封装进另一个类,该类可以实例化。

由于数据原因,改空数据无效,无法置空,采用上面方法解决; 

9:对于类似于datagrid这种在单元格处于编辑状态无法刷新视图的情况,可在退出编辑状态时添加LayoutUpdated事件(在布局发生更改时触发,即退出编辑状态后触发的事件),

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值