如何做到第一列做自增,剩余几列绑定List表中的数据。
(通过LoadingRow实现第一列的自增)
尝试过的方法一:
datagrid.Items.Clear();
datagrid.ItemsSource = null;
datagrid.ItemsSource = list;
Clear句报错:
错误信息:使用ItemsSource时操作无效。改为使用ItemsControl.ItemsSource访问和修改元素。
尝试过的方法二:
datagrid.ItemsSource = null;
datagrid.ItemsSource = list;
第二句报错:
错误信息:在使用 ItemsSource 之前,项集合必须为空。
你怎么把wpf当winfom用阿,推荐使用绑定,不要直接给ItemsSource 赋值。绑定后,你新建数据时,只要给新建的数据的某个属性(和grid第一列绑定的那个属性)赋值就行了。伪代码如下:
void addCommand()
{
this.items.Add(new Item{Order = this.Items.last().Order + 1});
}
这个可以实现自增吗?
噢噢,大致明白了,就是更新数据时,同时给那些进行绑定的属性和需要自增的那一列同时做赋值操作。
采用了绑定的方式,是不报错了,但是还是没有数据显示。
@llkj: 为什么我试就可以阿,留下邮箱,我发你 代码。看是不是你想要的。
@会长: wuyanan_000@163.com
@llkj: 已发
@会长:已收到,感谢!
@会长: 使用这种绑定就必须要用MVVM模型吗?我没有采用这种方式。
@llkj: 不用mvvm,wpf已经废了一多半。数据驱动是一种比事件驱动先进的开发理念。
我现在尝试着采用MVVM模式,试运行了一下,不报错,也不显示数据,调试了几遍,程序也是按照正常的顺序在执行,就是到最后界面显示的时候,就什么也没了。
@llkj: 你绑定的数据是不是不是ObservableCollection<T>类型的?
@会长: 是的,我仿照着你的代码写得。现在我把这部分内容单独拿出来是可以用的, 我想现在不是这部分的问题,应该是我整个项目的逻辑上出现了问题。我再琢磨琢磨。
我找到问题的原因了,是我在DataGrid中增加Style时,忘记加DataGrid.Resources了。非常感谢你让我认识到了MVVM模式对于WPF的重要性!
@llkj: 客气了
这种第一列显示序号的跟后台数据无关的不需要绑定
直接用事件:
<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>
刚刚我把自增那一列注释掉了,还是会出现第二个错误,
整个项目中,别的DataGrid采用第二个方法进行的后台绑定没有问题,那个没有涉及数据库,这个涉及数据库,可是我从数据库进行查询之后,将返回的list表信息转存到了其他list表中,不知道怎么就出现这个问题了。