我有一个现有的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数据:
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元素看起来就像网格应该在的地方的一个小点。我假设这是(空)网格的边界。
如果有什么想法我会很感激的,我的东西都快用完了。谢谢。
发布于 2021-06-15 19:58:38
好吧,所以我想出了一个方法来满足我的需要。显然,绑定到XmlDataProvider并不是一条出路,尽管有一些文章是在不碎片网站和一些微软文档上发表的。我发现,如果绑定到XmlNodeList,就可以显示数据并动态填充网格字段。不过,有个陷阱..。字段布局仅在绑定到DataSource 和集合为空时自动填充,因此必须在重新绑定到新的XML数据源之前运行MyGrid.FieldLayouts.Clear();。下面是一些示例代码:
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;https://stackoverflow.com/questions/67975466
复制相似问题