XamDataGrid 未从 XML 填充

XamDataGrid not populating from XML

我有一个使用 MVVM 模式的现有 WPF 应用程序。我正在尝试向应用程序添加一个新的维护屏幕,用户会看到一个“查找 tables”组合框以供选择。当用户从组合框中选择查找 table 时,XamDataGrid 会填充所选查找 table 中的数据。后端是一个 MSSQL 数据库,带有一个名为“LookupTables”的 table。 LookupTables table 中的每一行都包含一些关键列和一些 XML 数据类型的列;一种用于架构,一种用于数据。因此,LookupTables 中的每一行都代表一个完整的查找 table,存储在 XML 文档中。 (这是 SQL Server 2014,因此没有 JSON 支持,因此 XML。)每个查找 table 都有自己独特的“列”集。 XML 的格式还不是一成不变的。我们当前的设计是让所有 XML 模式都以 <Root> 节点开始,并具有任意数量的子 <Row> 节点。每个节点都会有一些属性,例如:<Row MyColumn1="some value" MyColumn2="Some other value" />.

组合框可以正常工作。数据从数据库正确加载。当用户选择一个项目时,我使用以下代码尝试将 xamDataGrid 绑定到 XML 数据:

        XmlDocument lookupValueDoc = new XmlDocument();
        //lookupValueDoc.LoadXml(SelectedTable.XMLValue);
        // For debugging, I've been ignoring the above line and hard-coding to this...
        string s = "<?xml version='1.0' ?><Root><row test1=\"aaaa\" test2=\"bbbb\"><testa>AAA</testa></row></Root>";
        lookupValueDoc.LoadXml(s);

        XmlDataProvider provider = new XmlDataProvider();
        if (provider != null)
        {
            provider.Document = lookupValueDoc;
            provider.XPath = "/Root";
        }

        SelectedTableData = provider;  // My XamDataGrid is binding to SelectedTableData.

我的 XAML 网格看起来像...

<igDP:XamDataGrid Name="LookupGrid" Margin="5"  GroupByAreaLocation="None"  Grid.Row="2" 
            HorizontalAlignment="Left" VerticalAlignment="Top" DataContext="{Binding SelectedTableData}" DataSource="{Binding XPath=Row, Mode=OneWay}"
            BorderThickness="1" BorderBrush="DarkCyan" ScrollViewer.VerticalScrollBarVisibility="Auto" 
            RecordUpdated="LookupGrid_RecordUpdated"
            IsUndoEnabled="True" UndoLimit="50" DataSourceChanged="XamDataGrid_DataSourceChanged"
            Visibility="Visible" >
    <!-- Some other stuff -->
</igDP:XamDataGrid>

但网格似乎没有约束力。 UI 元素看起来像一个小点,网格应该在这个位置。我假设这是(空)网格的边界。

如果有任何想法,我将不胜感激,我 运行 无法尝试。 谢谢。

好的,所以我找到了一种方法来做我需要的。尽管 Infragistics 站点和一些 Microsoft 文档上有文章,但显然绑定到 XmlDataProvider 不是可行的方法。我发现,如果我绑定到 XmlNodeList,我就会显示数据并动态填充网格字段。但是,有一个问题...只有当您绑定到 DataSource 并且 FieldLayouts 集合为空时,字段布局才会自动填充! 所以您有到 运行 MyGrid.FieldLayouts.Clear();,然后重新绑定到新的 XML 数据源。这是一些示例代码:

XmlDocument myXmlDoc = new XmlDocument();
string s = "<Root><row test1=\"aaaa\" test2=\"bbbb\"><testa>AAA</testa></row><row test1=\"AAAA\" test2=\"BBBB\"><testa>XXX</testa></row><row test1=\"A\" test2=\"B\"><testa>X</testa></row></Root>";
myXmlDoc.LoadXml(s);
XmlNode root = myXmlDoc.DocumentElement;
XmlNodeList nodeList = root.SelectNodes("descendant::row");  // This removes the top level of the hierarchy.  It's not required, but met my needs.

MyGrid.FieldLayouts.Clear();
MyGrid.DataSource = nodeList;