0

我正在开发一个 WPF 应用程序,需要将 RadGridView 绑定到 XML 文档,并且对于我的列,显示来自节点属性的数据。

目前它给了我正确的行数,但不是我正在寻找的值,而是显示字符串“System.Xml.XmlElement”

这是我的 XAML。

<telerik:RadGridView Name="uxSettings" ItemsSource="{Binding XmlSettings}" AutoGenerateColumns="False"
RowIndicatorVisibility="Visible"  Grid.Row="2" Grid.Column="1" Height="150" 
ShowGroupPanel="False" Width="350"  Margin="10"  IsFilteringAllowed="False">
<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding XPath=@ID}" Header="Item Name" Width="300"/>
</telerik:RadGridView.Columns>

这是我要绑定的 xml。

<settings>
<setting ID="OutputXOffset" value="12" />
<setting ID="OutputYOffset" value="12" />
</settings>

我实际上绑定到像这样填充的 ObservableCollection 集合。

public ObservableCollection<XmlNode> PopulateXmlSettings(XmlDocument settingsDoc)

{ XmlDataProvider 提供者 = 新 XmlDataProvider(); 提供者.IsAsynchronous = false; provider.Document = settingsDoc; provider.XPath = "设置/设置";

return  new ObservableCollection<XmlNode>((IEnumerable<XmlNode>)provider.Data);

}

理想情况下,我希望 ID 的“OutputXOffset 和 OutputYOffset”是可见的,并且只有值“12”是可编辑的。

4

3 回答 3

0

看起来像是 Telerik 控件中的一个错误,您可能想要报告。为了测试这一点,我写了你的 xml,比如;

<XmlDataProvider x:Key="XmlSettings" XPath="/settings/setting">
  <x:XData>
    <settings xmlns="">
      <setting ID="OutputXOffset" value="12"/>
      <setting ID="OutputYOffset" value="12"/>
    </settings>
  </x:XData>
</XmlDataProvider>

然后用 DataGrid 和 Telerik RadGridView 绑定到它;

<DataGrid Grid.Row="0" AutoGenerateColumns="False"
    ItemsSource="{Binding Source={StaticResource XmlSettings}}">
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding XPath=@ID}"/>
    <DataGridTextColumn Binding="{Binding XPath=@value}"/>
  </DataGrid.Columns>
</DataGrid>

<telerik:RadGridView Grid.Row="1" AutoGenerateColumns="False"
    ItemsSource="{Binding Source={StaticResource XmlSettings}}">
  <telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding XPath=@ID}"/>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding XPath=@value}"/>
  </telerik:RadGridView.Columns>
</telerik:RadGridView>

并且 DataGrid 可以工作,但 RadGridView 没有,而是如您所说返回一个 xmlElement 。为了获得 xmlElement 的值,我想我会为绑定编写一个简单的转换器 (IValueConverter)。一旦我这样做了,我发现转换器接收整个“设置”元素而不是 XPath 指向的属性,所以转换器看起来像;

Imports System.Xml

<ValueConversion(GetType(XmlElement), GetType(String))> _
Public Class xmlElement2String
    Implements IValueConverter

  Public Function Convert(value As Object, targetType As Type, 
      parameter As Object, culture As System.Globalization.CultureInfo
      ) As Object Implements System.Windows.Data.IValueConverter.Convert
    Dim anXmlElement As XmlElement = TryCast(value, XmlElement)
    If anXmlElement is Nothing then Return Binding.DoNothing
    Return anXmlElement.SelectSingleNode(CType(parameter,String)).Value
  End Function

  Public Function ConvertBack(value As Object, targetType As Type, 
      parameter As Object, culture As System.Globalization.CultureInfo
      ) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
    throw new System.NotImplementedException("Not implemented.")
  End Function
End Class

因此,您可以在 Xaml 中添加对值转换器的引用,例如;

<local:xmlElement2String x:Key="xmlElement2String"/>

并将您的绑定更改为;

<telerik:GridViewDataColumn DataMemberBinding="{Binding XPath=@ID, 
    Converter={StaticResource xmlElement2String}, ConverterParameter=@ID}"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding
    Converter={StaticResource xmlElement2String}, ConverterParameter=@value}"/>

请注意,对于“ID”,我将 XPath 语句保留在其中,对于“value”,我将其关闭,这没有任何区别。希望这可以帮助...

于 2011-02-03T21:20:18.360 回答
0

您可以尝试首先在窗口定义中包含您的解决方案命名空间,然后在资源中包含 observablecollection 集合类,如下所示

<Window.Resources>
     <solutionNameSpace:ClassName x:Key="Class1" />
</Window.Resources>
.
.

然后更新控制如下

<telerik:RadGridView ....... ItemSource="{StaticResource Class1}" ....>
<telerik:RadGridView.Columns>
    <telerik:GridViewColumn DataMemberBinding="{Binding Path=ID}" .....>
</telerik.RadView.Columns>
于 2011-01-26T17:49:44.183 回答
0

与其直接绑定到 XmlNodes,不如创建您自己的类型,该类型公开您的 UI 所需的适当属性并绑定到这些属性的集合。

另一种选择是从 XmlNode 继承并覆盖 ToString() 以返回要在列中显示的值......但我不推荐这样做。我更喜欢创建 POCO 并使用来自数据源的数据填充它们并绑定到 POCO。

从头开始;看来您无论如何都不能从 XmlNode 继承。

于 2011-01-26T17:55:48.707 回答