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(); provider.IsAsynchronous = false; provider.Document = settingsDoc; provider.XPath = "設定/設定";

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

}

理想的には、ID の「OutputXOffset および OutputYOffset」を表示可能にし、値「12」のみを編集可能にしたいと考えています。

4

3 に答える 3

0

XmlNodes に直接バインドする代わりに、UI に必要な適切なプロパティを公開する独自の型を作成し、それらのコレクションにバインドします。

別のオプションは、XmlNode から継承し、ToString() をオーバーライドして、列に表示する値を返すことですが、これはお勧めしません。POCO を作成し、データソースからのデータを入力して POCO にバインドすることを好みます。

それをスクラッチします。とにかく XmlNode から継承できないようです。

于 2011-01-26T17:55:48.707 に答える
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 ステートメントをそのままにして、「値」の場合は省略したことに注意してください。違いはありません。お役に立てれば...

于 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 に答える