修改WPF后,将DataGrid中的完整内容写回xml文件

时间:2018-04-03 06:17:44

标签: c# xml wpf datagrid

我在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>

2 个答案:

答案 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因未向源发布更新而臭名昭着。

编辑:您的命令性代码让我认为您的视图模型未正确/完全定义。