首页 新闻 会员 周边 捐助

wpf DataGrid 数据绑定

0
悬赏园豆:10 [已解决问题] 解决于 2020-11-05 15:45

如何做到第一列做自增,剩余几列绑定List表中的数据。

(通过LoadingRow实现第一列的自增)
尝试过的方法一:
datagrid.Items.Clear();
datagrid.ItemsSource = null;
datagrid.ItemsSource = list;

Clear句报错:
错误信息:使用ItemsSource时操作无效。改为使用ItemsControl.ItemsSource访问和修改元素。

尝试过的方法二:
datagrid.ItemsSource = null;
datagrid.ItemsSource = list;
第二句报错:
错误信息:在使用 ItemsSource 之前,项集合必须为空。

WPF
llkj的主页 llkj | 初学一级 | 园豆:179
提问于:2020-11-05 10:50
< >
分享
最佳答案
1

你怎么把wpf当winfom用阿,推荐使用绑定,不要直接给ItemsSource 赋值。绑定后,你新建数据时,只要给新建的数据的某个属性(和grid第一列绑定的那个属性)赋值就行了。伪代码如下:

void addCommand()
{
  this.items.Add(new Item{Order = this.Items.last().Order + 1});
}
收获园豆:9
会长 | 专家六级 |园豆:12463 | 2020-11-05 11:58

这个可以实现自增吗?

llkj | 园豆:179 (初学一级) | 2020-11-05 12:33

噢噢,大致明白了,就是更新数据时,同时给那些进行绑定的属性和需要自增的那一列同时做赋值操作。

llkj | 园豆:179 (初学一级) | 2020-11-05 12:37

采用了绑定的方式,是不报错了,但是还是没有数据显示。

llkj | 园豆:179 (初学一级) | 2020-11-05 13:46

@llkj: 为什么我试就可以阿,留下邮箱,我发你 代码。看是不是你想要的。

会长 | 园豆:12463 (专家六级) | 2020-11-05 14:04

@会长: wuyanan_000@163.com

llkj | 园豆:179 (初学一级) | 2020-11-05 14:07

@llkj: 已发

会长 | 园豆:12463 (专家六级) | 2020-11-05 14:11

@会长:已收到,感谢!

llkj | 园豆:179 (初学一级) | 2020-11-05 14:26

@会长: 使用这种绑定就必须要用MVVM模型吗?我没有采用这种方式。

llkj | 园豆:179 (初学一级) | 2020-11-05 14:27

@llkj: 不用mvvm,wpf已经废了一多半。数据驱动是一种比事件驱动先进的开发理念。

会长 | 园豆:12463 (专家六级) | 2020-11-05 14:39

我现在尝试着采用MVVM模式,试运行了一下,不报错,也不显示数据,调试了几遍,程序也是按照正常的顺序在执行,就是到最后界面显示的时候,就什么也没了。

llkj | 园豆:179 (初学一级) | 2020-11-05 14:58

@llkj: 你绑定的数据是不是不是ObservableCollection<T>类型的?

会长 | 园豆:12463 (专家六级) | 2020-11-05 15:00

@会长: 是的,我仿照着你的代码写得。现在我把这部分内容单独拿出来是可以用的, 我想现在不是这部分的问题,应该是我整个项目的逻辑上出现了问题。我再琢磨琢磨。

llkj | 园豆:179 (初学一级) | 2020-11-05 15:11

我找到问题的原因了,是我在DataGrid中增加Style时,忘记加DataGrid.Resources了。非常感谢你让我认识到了MVVM模式对于WPF的重要性!

llkj | 园豆:179 (初学一级) | 2020-11-05 15:22

@llkj: 客气了

会长 | 园豆:12463 (专家六级) | 2020-11-05 16:12
其他回答(1)
0

这种第一列显示序号的跟后台数据无关的不需要绑定

直接用事件:

<DataGrid x:Name="datagrid" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" Style="{DynamicResource AzureDataGrid}" AutoGenerateColumns="False" IsReadOnly="True" LoadingRow="DataGrid_LoadingRow" >


private void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
e.Row.Header = e.Row.GetIndex() + 1;
}


给你一个完整的把:
<Grid Grid.Row="1" Margin="10,5">
<GroupBox Style="{x:Null}" Margin="20,20,0,0" >
<DataGrid x:Name="datagrid" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" Style="{DynamicResource AzureDataGrid}" AutoGenerateColumns="False" IsReadOnly="True" LoadingRow="DataGrid_LoadingRow" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="{Binding EditCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<DataGrid.Columns>
<DataGridTemplateColumn Header="{x:Static lang:Common.Index}" Width="50" MinWidth="10" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow}}, Path=Header}" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="10,0,0,0"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="测试时间" Binding="{Binding Path=TestTime}"/>
<DataGridTextColumn Header="测量用户" Binding="{Binding Path=UserName}"/>
<DataGridTextColumn Header="测量类型" Binding="{Binding Path=TestItemName}"/>
<DataGridTextColumn Header="测量结果" Binding="{Binding Path=ResultTargetName}"/>
<DataGridTextColumn Header="样品名称" Binding="{Binding Path=Data.Sample.Base.Name}"/>
</DataGrid.Columns>
</DataGrid>
</GroupBox>
</Grid>

收获园豆:1
猝不及防 | 园豆:2878 (老鸟四级) | 2020-11-05 11:19

刚刚我把自增那一列注释掉了,还是会出现第二个错误,

支持(0) 反对(0) llkj | 园豆:179 (初学一级) | 2020-11-05 11:28

整个项目中,别的DataGrid采用第二个方法进行的后台绑定没有问题,那个没有涉及数据库,这个涉及数据库,可是我从数据库进行查询之后,将返回的list表信息转存到了其他list表中,不知道怎么就出现这个问题了。

支持(0) 反对(0) llkj | 园豆:179 (初学一级) | 2020-11-05 11:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册