WPF DataGrid 赋值与修改
下方绑定给 DataGrid 控件的类模型
public record DataGridModel{public string GongNeng{get; set;}public DataGridModel(string gongNeng){GongNeng = gongNeng;}}
一、DataGrid 绑定对应的属性
DataGrid 绑定列,将对应的属性绑定给对应的列
写法:Binding="{Binding 属性名}"
<DataGrid.Columns><!--ElementStyle 设置元素样式--><DataGridTextColumn Header="功能" Width="*" Binding="{Binding GongNeng}"></DataGridTextColumn>
</DataGrid.Columns>
二、为 DataGrid 赋值
方法一:
再 cs 文件中直接给对应的 DataGrid 控件赋数据源
...
public List<DataGridModel> DataGridModels { get; set; }
...
//我这里 DataGrid 控件 Name 为 main_datagrid_display
main_datagrid_display.ItemsSource = DataGridModels;
...
方法二:
再 xaml 文件中直接给对应的 DataGrid 控件赋数据源
情况一:
ItemsSource=“{Binding RelativeSource={RelativeSource AncestorType=对应数据源路径},Path=对应数据源名称}”
如果这里数据源在父类、或者父类的父类、或者其他类中等等,需要将对应的路径指定正确
<DataGrid Name="main_datagrid_display" Width="1268" Height="193" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=local:MainBody},Path=DataGridModels}">
...
</DataGrid>
情况二:
ItemsSource=“{Binding 对应数据源名称}”
情况一简写写法,但是必须在 cs 文件中加上
this.DataContext = 对应数据源路径;
正常情况下,我们会书写一个视图,将所有的数据处理都放在那个视图当中,这时数据源属性也会定义在该视图中,所有对数据的操作也会在该视图中,但是需要将 this.DataContext 赋值为该视图对象
在这里插入代码片```csharp
//cs 文件
InitializeComponent();
//一般写在 InitializeComponent() 方法下面,我这里没有使用 MVVM 模式,所有的数据处理都在该 cs 文件中,所以指定为 this
this.DataContext = this;
//xaml 文件
<DataGrid Name="main_datagrid_display" Width="1268" Height="193" ItemsSource="{Binding DataGridModels}">
</DataGrid>
三、修改 DataGrid 数据
当内部数据源修改时,如果需要前端页面也跟着一起修改,需要继承 INotifyPropertyChanged 接口,并实现 PropertyChanged 事件
我们这里对上面的类模型进行修改:
public record DataGridModel : INotifyPropertyChanged
{private string _gongNeng;public string GongNeng{get { return _gongNeng; }set{if (value != _gongNeng){_gongNeng = value;if (null != PropertyChanged){PropertyChanged(this, new PropertyChangedEventArgs("GongNeng"));//当被改变时,告知前端页面}}}}public DataGridModel(string gongNeng){GongNeng = gongNeng;}public event PropertyChangedEventHandler? PropertyChanged;//实现 PropertyChanged 事件}
如果绑定的属性是一个集合的话,也可以使用 WPF 自带的 ObservableCollection 集合,其内部帮我们实现了 INotifyCollectionChanged, INotifyPropertyChanged,当后台数据改变时,会自动帮我们更新前端的数据。
但是使用 ObservableCollection 需要注意要为其初始化一个对象,否则会出现后端数据变了,前端数据不变化的情况,且 ObservableCollection 只有在新增或者删除一条数据的时候,才回去通知前端
ObservableCollection<string> Test { get; set; } = new ObservableCollection<string>();//需要为其初始化
上述均是前后端不分离的情况,如果使用 MVVM 方式去书写,需要定义对应的模型视图等等,数据处理全部在视图中进行。。。