2011-01-26 33 views
0

我正在處理WPF應用程序,並需要將RadGridView綁定到XML文檔,並且對於我的列,顯示節點屬性中的數據。需要將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 [email protected]}" 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(); provider.IsAsynchronous = false; provider.Document = settingsDoc; provider.XPath =「設置/設置」;

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

}

理想我想要的ID的 「OutputXOffset和OutputYOffset」 是可見的,只值 「12」 可編輯。

回答

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> 
0

取而代之的結合嘗試直接到XmlNodes,創建你自己的類型,暴露你的UI所需的適當屬性並綁定到這些集合。

另一種選擇是從XmlNode繼承並重寫ToString()以返回要在列中顯示的值......但我不建議這樣做。我更喜歡創建POCO並使用來自數據源的數據並綁定到POCO。

劃痕;無論如何,你似乎無法繼承XmlNode。

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 [email protected]}"/> 
    <DataGridTextColumn Binding="{Binding [email protected]}"/> 
    </DataGrid.Columns> 
</DataGrid> 

<telerik:RadGridView Grid.Row="1" AutoGenerateColumns="False" 
    ItemsSource="{Binding Source={StaticResource XmlSettings}}"> 
    <telerik:RadGridView.Columns> 
    <telerik:GridViewDataColumn DataMemberBinding="{Binding [email protected]}"/> 
    <telerik:GridViewDataColumn DataMemberBinding="{Binding [email protected]}"/> 
    </telerik:RadGridView.Columns> 
</telerik:RadGridView> 

和DataGrid的工作原理,但RadGridView沒有,而是像你說的那樣返回一個xmlElement。爲了得到xmlElement的值,我想我會爲綁定編寫一個簡單的Converter(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 [email protected], 
    Converter={StaticResource xmlElement2String}, [email protected]}"/> 
<telerik:GridViewDataColumn DataMemberBinding="{Binding 
    Converter={StaticResource xmlElement2String}, [email protected]}"/> 

通知,對「ID」我離開的XPath語句和「價值」我把它關閉,這都沒有區別。希望這有助於...