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事件(在布局发生更改时触发,即退出编辑状态后触发的事件),