我有一个datagrid
,我用列表中的数据填充它。现在,我想将datagrid
中的所有数据返回到列表中。我怎么能够 ?
<DataGrid Name="InstrumentGrid"
VerticalAlignment="Top" HorizontalAlignment="left"
Margin="0,16,0,0" Grid.ColumnSpan="3" Grid.Row="19" Grid.RowSpan="2"
AutoGenerateColumns="False"
Width="422" Grid.Column="1">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Id}" />
<DataGridTemplateColumn Header="NCS Date" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<DatePicker BorderThickness="0" Height="20" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Instrument No" Binding="{Binding NcsNo}" />
<DataGridTextColumn Header="Type" Binding="{Binding Type}" />
<DataGridTextColumn Header="Bank Name" Width="*" Binding="{Binding BankName}" />
<DataGridTemplateColumn Header="Action">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<VirtualizingStackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Image Width="10" Margin="5 0 0 0" Height="10" Stretch="Fill" Source="/InstrumentManagement;component/wrongSign.png"></Image>
</VirtualizingStackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
将数据加载到DataGrid
private List<Data> list = new List<Data>();
public VehicleInOutWnd()
{
InitializeComponent();
for (int i = 0; i < 2; i++)
{
list.Add(new Data()
{
Id = i.ToString(),
BankName = "Bank al habib"+i,
NcsDate = "23/12/2018",
InstrumentNo = "234"+i,
Type = "Type abc"+i
});
}
InstrumentGrid.ItemsSource = list;
}
现在,我只想在DataGrid
中获取所有这些数据,就像在其他列表中的list<Data>
中一样。 button
点击功能上。
答案 0 :(得分:1)
我假设您需要更改后的数据网格中的数据。如果将初始列表列表(此处的命名令人困惑)绑定到数据网格,则将始终对其进行更新而无需人工干预。
最干净的解决方案是使用视图模型。
public class MyViewModel {
: INotifyPropertyChanged
public MyViewModel()
{
_myDataList = new List<Data>();
for (int i = 0; i < 2; i++)
{
_myDataList.Add(new Data()
{
Id = i.ToString(),
BankName = "Bank al habib"+i,
NcsDate = "23/12/2018",
InstrumentNo = "234"+i,
Type = "Type abc"+i
});
}
}
private List<Data> _myDataList;
public List<Data> MyDataList {
get { return _myDataList; }
set
{
_myDataList = value;
PropertyChanged.Invoke(this, new PropertyChangedEventArgs("MyDataList"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
此类包含创建数据列表的逻辑,也可以在视图上添加其他内容。 INotifyPropertyChanged可确保屏幕与您在代码中输入的数据保持同步。
这允许您只创建一个视图模型并将其作为视图的数据上下文。
private MyViewModel _viewModel;
public VehicleInOutWnd()
{
InitializeComponent();
_viewModel = new MyViewModel();
this.DataContext = _viewModel;
public void ClickButton()
{
// You could just access _viewModel.MyDataList for an up-to-date list.
}
}
XAML将更改为以下内容以适应新的数据上下文。
<DataGrid Name="InstrumentGrid"
ItemsSource={Binding MyDataList}
VerticalAlignment="Top" HorizontalAlignment="left"
Margin="0,16,0,0" Grid.ColumnSpan="3" Grid.Row="19" Grid.RowSpan="2"
AutoGenerateColumns="False"
Width="422" Grid.Column="1">
答案 1 :(得分:1)
如果您的数据类的所有属性均为值类型,请创建新的列表
var originalList = InstrumentGrid.ItemsSource as List<Data>;
var anotherList= new List<Data>(originalList);
但是,如果您的数据类具有Refreence类型的成员,则应该 在您的类中添加一个copy-constructor方法,该方法将初始化Data并 那么您可以像这样克隆您的列表
originalList.ForEach((item)=>
{
anotherList.Add(new Data(item));
});
答案 2 :(得分:1)
在DataGrid
中编辑单元格时,您正在Data
中设置list
类的相应属性。因此,所有编辑的数据已经在list
中。在清除原始列表之前,只需从那里获取它即可。
var modifiedData = list.ToList(); //creates a copy of the list that contains the modified data
list.Clear(); //clears the original list.
答案 3 :(得分:0)
您可以尝试获取网格的DataContext。
假设您希望单击按钮时获得该列表,可以在xaml.cs中编写按钮单击处理程序,那么代码将类似于:
var list = (List<Data>)InstrumentGrid.DataSource;
viewModel.ProcessListofData(list);