Необходимо привязать WPF RadGridView к документу XML и отобразить значения атрибутов в сетке. - PullRequest
0 голосов
/ 26 января 2011

Я работаю над приложением 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 provider = new XmlDataProvider (); provider.IsAsynchronous = false; provider.Document = settingsDoc; provider.XPath = "settings / setting";

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

}

В идеале я хочу, чтобы идентификаторы "OutputXOffset and OutputYOffset" идентификатора были доступны для просмотра, а редактировались только значения "12".

Ответы [ 3 ]

0 голосов
/ 26 января 2011

Вместо привязки непосредственно к XmlNodes создайте свой собственный тип, который предоставляет соответствующие свойства, необходимые для вашего пользовательского интерфейса, и привязывает их к коллекции.

Другой вариант - наследовать от XmlNode и переопределить ToString (), чтобы вернуть значение, которое вы хотите отобразить в столбце ... но я не рекомендую этого Я предпочитаю создавать POCO и заполнять их данными из источника данных и связывать с POCO.

Поцарапайте это; кажется, что вы все равно не можете наследовать от XmlNode.

0 голосов
/ 04 февраля 2011

Похоже на ошибку в элементе управления 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) для привязки. Как только я это сделал, я обнаружил, что конвертер получает весь элемент «setting» вместо атрибута, на который указывает 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, а для "значения" я оставил его, и это не имеет значения. Надеюсь, это поможет ...

0 голосов
/ 26 января 2011

Вы можете попробовать сначала включить пространство имен вашего решения в определение окна, а затем включить класс коллекции 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>
...