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;
我有一个使用 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;