我在WPF中有一个DataGrid,我用这样的XML填充:
dataGrid.ItemsSource = Responsible.GetResponsibles();
GetResponsibles()
方法读取XML并返回
ObservableCollection<Responsible>()
当用户点击按钮时,执行以下方法:
private void submit_Click(object sender, RoutedEventArgs e)
{
//write the dataGrid contents to disk
XDocument doc = new XDocument(new XElement("dat",new XElement("responsibles"), new XElement("parameters"), new XElement("tags")));
var itemsSource = dataGrid.Items as IEnumerable;
if (itemsSource != null)
{
foreach (var item in itemsSource)
{
var row = dataGrid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
if (row != null)
{
string[] cell = new string[4];
int colPos = 0;
foreach (DataGridColumn column in dataGrid.Columns)
{
if (column.GetCellContent(row) is TextBlock)
{
TextBlock cellContent = column.GetCellContent(row) as TextBlock;
cell[colPos++] = cellContent.Text;
}
}
doc.Root.Element("responsibles").Add(new XElement("responsible", new XAttribute("key", cell[0])));
//TODO write cell[1-3] to xml
}
}
}
doc.Save("testOutput.xml");
}
我使用其他几篇关于同一主题的帖子的答案将我们聚集在一起。我的问题是它只保存dataGrid
中的可见内容而不是完整数据。在寻找相当长时间的解决方案后,我无法理解为什么。我需要做什么才能适应所有数据,而不仅仅是可见部分?
这是DataGrid
的XAML。
<DataGrid x:Name="dataGrid" AlternationCount="2" Height="253" VerticalAlignment="Top">
<DataGrid.AlternatingRowBackground>
<SolidColorBrush Color="{DynamicResource {x:Static SystemColors.ControlColorKey}}"/>
</DataGrid.AlternatingRowBackground>
</DataGrid>
答案 0 :(得分:1)
执行此操作时:var itemsSource = dataGrid.Items as IEnumerable - 您拥有DataGrid的所有内容。如果用户在DataGrid中编辑或添加了某些内容,则新数据也将存在。 在foreach(itemsSource中的var项目)中,您可以使用类型为Responsible的项目,只需从项目中保存所需的所有内容,然后删除与DataGridRow相关的所有代码。
foreach (var item in itemsSource)
{
doc.Root.Element("responsibles").Add(new XElement("responsible", new XAttribute("key", item.PropertyName)));
}
答案 1 :(得分:0)
这不会显示您的商品模板。你确定这是整个XAML吗?
无论如何,我得到的是你不应该从dataGrid.Items中选择,而是从ItemsSource中选择。如果您的数据绑定是双向的,那么ItemsSource将已经拥有最新数据。
更好的是,您可以保留对Responsible.GetResponsibles()的引用,并且双向数据绑定将使其保持最新。虽然在更新触发器时要注意,但DataGrid因未向源发布更新而臭名昭着。
编辑:您的命令性代码让我认为您的视图模型未正确/完全定义。