
WPF中Prism框架 MVVM知识点之 ObservableCollection动态集合,DataGrid控件
需要注意的是,当 DataGrid 的 CanUserSortColumns 属性设为 True 时,默认情况下 DataGrid 控件会根据列绑定到的数据类型进行排序,即数值型数据按照数值大小排序,字符串按照字典顺序排序等。在代码中,需要先创建一个数据源对象,这个数据源对象通常是一个集合,可以是集合类、数组或DataTable等,然后将其设置为DataGrid的ItemsSource属性值。需要
wpf中前后端交互用到了binding 到处都会有各种绑定。项目中有实际案例加以总结,学习,加固。
<DataGrid Grid.Row="0"
Background="Transparent"
AutoGenerateColumns="False"
CanUserSortColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
Margin="0"
IsReadOnly="True"
SelectedIndex="{Binding CurSelectedWFIndex}"
ItemsSource="{Binding WorkFlowList}"
SelectedItem="{Binding CurSelectedWF}"
Name="dgWF"
>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding dgWFSelectedChangedCmd}"
CommandParameter="{Binding ElementName=dgWF,Path=SelectedItem}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<DataGrid.Columns>
<!--<DataGridTextColumn Header="编号" Binding="{Binding WFID}"/>-->
<DataGridTextColumn Header="名称" Binding="{Binding WFName}"/>
<!--<DataGridTextColumn Header="添加时间" Binding="{Binding AddTime}"/>-->
</DataGrid.Columns>
</DataGrid>
首先看一段XAML代码 在dataGrid中,
1, AutoGenerateColumns属性:
以下内容来自chatGpt:
在 WPF 中,DataGrid 控件用于展示数据表格,并通过 AutoGenerateColumns 属性来控制是否自动生成列。当 AutoGenerateColumns 属性设为 True 时,DataGrid 控件会根据数据绑定的源类型自动生成列。例如,如果数据源是一个集合,那么 DataGrid 会为该集合中的每个属性自动生成一个列。如果数据源是 DataTable,那么 DataGrid 会为 DataTable 的每个列生成一个 DataGridTextBoxColumn 或 DataGridComboBoxColumn。
另外,AutoGenerateColumns 属性可以在 DataGrid 控件的 XAML 代码、代码中、或者在继承 DataGrid 控件的类中进行设置。如果设置 AutoGenerateColumns = "False",则需要手动添加 DataGridTextColumn、DataGridTemplateColumn、DataGridComboBoxColumn 等列,这样可以更加灵活地控制列的样式和显示方式。需要注意的是,当 AutoGenerateColumns 属性为 True 时,DataGrid 控件会自动根据数据源的变化更新列,但是如果手动添加了列,则需要手工更新列。
2, CanUserSortColumns属性:
以下内容来自chatGpt:
在 WPF 中,DataGrid 控件中的 CanUserSortColumns 属性控制用户是否可以通过点击列标题来对列进行排序。当 CanUserSortColumns 属性设置为 True 时,用户可以通过单击列标题来对该列数据进行升序或降序排列;而当 CanUserSortColumns 属性设置为 False 时,用户将无法进行此操作。
需要注意的是,当 DataGrid 的 CanUserSortColumns 属性设为 True 时,默认情况下 DataGrid 控件会根据列绑定到的数据类型进行排序,即数值型数据按照数值大小排序,字符串按照字典顺序排序等。如果需要更加灵活的排序方式,可以使用 DataGrid 控件的 SortMemberPath 属性或者自定义排序方式等方法来实现。
总之,CanUserSortColumns 属性是 DataGrid 控件提供的一种非常实用的特性,可以让用户方便地对数据进行排序,提高数据查找和浏览的效率。
3, CanUserAddRows和CanUserDeleteRows属性:
很好理解, CanUserAddRows设置true的时候,则用户可以通过在DataGrid中单击底部的空白行来添加新行,否则用户将无法添加新行。
CanUserDeleteRows属性控制用户是否可以通过在DataGrid中选择一行并按下“删除”键来删除该行。如果设置为True,则用户可以删除行,否则用户将无法删除行。
需要注意的是,这些属性只影响用户界面,不影响DataGrid中的数据源。如果你希望在DataGrid中添加或删除行时,在数据源中也添加或删除对应的数据,那么你需要在应用程序中手动编写代码实现对数据源的修改。
4,IsReadOnly, SelectedIndex,SelectedItem, ItemsSource,属性:
isReadOnly:在WPF中,DataGrid控件具有一个名为IsReadOnly的属性,它用于指定DataGrid是否只读。如果将IsReadOnly设置为True,则用户无法编辑或选择DataGrid中的单元格,否则用户可以在DataGrid中编辑和选择单元格。此外,你还可以在DataGrid的列(Column)上设置IsReadOnly属性,以便在列级别上控制单元格的可编辑性。如果在列级别上设置了IsReadOnly属性,则该列中的单元格将始终处于只读状态,而不受DataGrid的全局IsReadOnly属性的影响。请注意,IsReadOnly属性只控制用户界面上的行为,而不会影响数据源,如果需要更新数据源,需要编写代码来处理DataGrid中单元格的更改。
SelectedIndex:
在WPF中,DataGrid控件具有一个名为SelectedIndex的属性,它用于获取或设置DataGrid中当前选定行的索引。可以通过设置SelectedIndex属性来将DataGrid的选择项指定为特定行。
要使用SelectedIndex属性,需要将DataGrid的SelectionMode属性设置为Single或Extended,然后就可以访问SelectedIndex。
以下是一个示例,展示如何在WPF中使用SelectedIndex属性:
<DataGrid x:Name="myDataGrid" SelectionMode="Single">
<!-- 在此处添加列 -->
</DataGrid>
在代码中,你可以通过以下方式来获取和设置SelectedIndex属性:
// 获取当前选定行的索引
int selectedIndex = myDataGrid.SelectedIndex;
// 设置选定行的索引
myDataGrid.SelectedIndex = 3;
需要注意的是,如果SelectionMode属性设置为Single,则只能选择一行,而如果SelectionMode属性设置为Extended,则可以同时选择多行。在SelectionMode设置为Extended时,可以通过DataGrid的SelectedItems属性获取所有选中的行。
SelectedItem:
在WPF中,DataGrid控件具有一个名为SelectedItem的属性,它用于获取或设置DataGrid中当前选定项的数据对象。可以通过设置SelectedItem属性来将DataGrid的选择项指定为特定行的数据对象。
要使用SelectedItem属性,需要确保DataGrid的ItemsSource属性已经绑定到了数据源,并且数据源中的每个项都是一个对象。此时,SelectedItem属性将指向DataGrid中当前选定行的数据对象。
以下是一个示例,展示如何在WPF中使用SelectedItem属性:
<DataGrid x:Name="myDataGrid" ItemsSource="{Binding MyList}" SelectionMode="Single">
<!-- 在此处添加列 -->
</DataGrid>
在代码中,你可以通过以下方式来获取和设置SelectedItem属性:
// 获取当前选定行的数据对象
object selectedObject = myDataGrid.SelectedItem;
// 设置选定行的数据对象
myDataGrid.SelectedItem = MyList[3];
需要注意的是,如果SelectionMode属性设置为Single,则只能选择一行,而如果SelectionMode属性设置为Extended,则可以同时选择多行。在SelectionMode设置为Extended时,可以通过DataGrid的SelectedItems属性获取所有选中的行的数据对象列表。
ItemsSource:
在WPF中,DataGrid控件的ItemsSource属性用于指定DataGrid所绑定的数据源。当你设置ItemsSource属性时,DataGrid会自动将其列绑定到数据源中的属性或字段。
以下是一个示例,展示如何在WPF中使用ItemsSource属性:
<DataGrid x:Name="myDataGrid" ItemsSource="{Binding MyList}">
<!-- 在此处添加列 -->
</DataGrid>
在代码中,需要先创建一个数据源对象,这个数据源对象通常是一个集合,可以是集合类、数组或DataTable等,然后将其设置为DataGrid的ItemsSource属性值。在设置ItemsSource属性时,你还可以使用数据绑定表达式来绑定数据源,以便DataGrid能够自动更新数据源中的数据。
下面是一个绑定到ObservableCollection的示例,其中DataGrid的ItemsSource通过XAML数据绑定来绑定到ViewModel中的某个可观察集合:
<DataGrid x:Name="myDataGrid" ItemsSource="{Binding MyObservableCollection}" />
需要注意的是,DataGrid只会绑定可以公开访问的属性或字段,因此请确保数据源对象中包含所需的属性或字段。
如果你需要在代码中将DataGrid的数据源更改为不同的数据源,请注意执行以下步骤:
- 创建和绑定到新的数据源对象。
- 将DataGrid的ItemsSource属性设置为新数据源对象。
ObservableCollection动态集合:
下面以下面代码为例进行讲解:
<TabItem Header="轴4-超声运动" Visibility="Visible">
<DataGrid ItemsSource="{Binding Path=Axis4,Mode=TwoWay}" AutoGenerateColumns="False"
CanUserSortColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" Grid.ColumnSpan="2"
>
<DataGrid.Columns>
<DataGridTextColumn Header="位置" Binding="{Binding Position}" IsReadOnly="True"/>
<DataGridTextColumn Header="值" Binding="{Binding Path=Value,Mode=TwoWay}">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background" Value="{Binding BackColor}"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="注释" Binding="{Binding Tip}" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
</TabItem>
代码中可以看出datagrid 里的itemsource 绑定的是Axis4 ,我们去业务逻辑代码里看下这个Axis4到底是啥, ObservableCollection<AxisConfig> Axis4 = mycfgData.GetAxisConfig(4);
从这句代码里能看出 Axis4是一个动态集合的一个对象,对象里存放的是AxisConfig类里的成员,有点类似于list<T>泛型集合
更多推荐
所有评论(0)