WPF中Prism框架 MVVM知识点之 ObservableCollection动态集合,DataGrid控件

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的数据源更改为不同的数据源,请注意执行以下步骤:

  1. 创建和绑定到新的数据源对象。
  2. 将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>泛型集合

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MVVM是一种软件架构模式,用于将用户界面的逻辑与数据分离,以便更好地管理和维护代码。在WPF,可以使用MVVM模式来实现DataGrid动态列和编辑器。 首先,我们可以创建一个ViewModel类,该类将持有DataGrid的数据和列信息。我们可以使用ObservableCollection<T>来存储数据,这样当数据发生变化时,DataGrid会自动更新。 然后,我们可以在ViewModel定义一个命令,用于处理用户对DataGrid的数据进行编辑的操作。当用户点击编辑按钮时,命令会被调用,并传递要编辑的数据作为参数。 接下来,我们可以在View使用DataGrid来展示ViewModel的数据。通过绑定DataGrid的ItemsSource属性到ViewModel的数据集合,可以实现动态列的效果。当ViewModel的数据发生变化时,DataGrid会自动刷新。 在DataGrid的列定义,我们可以使用DataGridTemplateColumn来定义自定义的编辑器。通过绑定该列的CellTemplate和CellEditingTemplate属性到ViewModel的编辑器,在用户编辑数据时,可以使用自定义的编辑器来展示和保存数据。 最后,我们需要将View与ViewModel进行绑定,以实现数据的双向同步。可以使用DataBinding来将ViewModel的属性与View控件进行绑定,这样当属性发生变化时,控件会自动更新,并且当用户对控件进行操作时,属性也会相应地更新。 总而言之,使用MVVM模式可以将DataGrid动态列和编辑器实现得更加灵活和可维护。通过将数据和逻辑分离,我们可以更好地组织代码,并实现更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值