首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不从XML填充XamDataGrid

不从XML填充XamDataGrid
EN

Stack Overflow用户
提问于 2021-06-14 18:31:04
回答 1查看 55关注 0票数 0

我有一个现有的WPF应用程序,它使用MVVM模式。我试图在应用程序中添加一个新的维护屏幕,在该应用程序中,用户将有一个“查找表”的组合框供选择。当用户从组合框中选择查找表时,将使用所选查找表中的数据填充XamDataGrid。后端是一个MSSQL数据库,其表名为"LookupTables“。LookupTables表中的每一行包含一些键列和几个XML数据类型的列;一个用于模式,另一个用于数据。因此,LookupTables中的每一行都表示一个存储在XML中的完整查找表。(这是SQL Server 2014,因此不支持JSON,因此使用了XML。)每个查找表都有自己独特的一组“列”。而且XML的格式还没有固定下来。我们目前的设计是让所有XML从一个<Root>节点开始,并有任意数量的子<Row>节点。每个节点都有一些属性,例如:<Row MyColumn1="some value" MyColumn2="Some other value" />

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

代码语言:javascript
复制
        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看起来就像..。

代码语言:javascript
复制
<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元素看起来就像网格应该在的地方的一个小点。我假设这是(空)网格的边界。

如果有什么想法我会很感激的,我的东西都快用完了。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-15 19:58:38

好吧,所以我想出了一个方法来满足我的需要。显然,绑定到XmlDataProvider并不是一条出路,尽管有一些文章是在不碎片网站和一些微软文档上发表的。我发现,如果绑定到XmlNodeList,就可以显示数据并动态填充网格字段。不过,有个陷阱..。字段布局仅在绑定到DataSource 和集合为空时自动填充,因此必须在重新绑定到新的XML数据源之前运行MyGrid.FieldLayouts.Clear();。下面是一些示例代码:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67975466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档