WPF将XML元素转换为DataGrid内容

时间:2015-02-25 22:09:11

标签: c# xml wpf datagrid valueconverter

编辑:我对另一种方法持开放态度。源数据是XML,但肯定有其他方法可以使数据网格表现出来。

This answer got me started,但在DataGrid中似乎有所不同。如果我省略值转换器,代码工作正常,但如果我输入值转换器,我收到的所有输入都是空字符串。

好但不完美:

    <DataGridTextColumn 
                Header="Length" 
                Binding="{Binding XPath=length/@value}}" />

垃圾:

    <DataGridTextColumn 
                Header="Length" 
                Binding="{Binding XPath=length, 
                          Converter={StaticResource valueFormattingConverter }}" />

我有一个理论,上面给出了元素./length的元素内容(它是一个空元素),但我实际上想要元素./length,因为需要处理属性。

好但是对于组合框:

<ComboBox Style="{StaticResource ComboButtonStyle}" Width="200" 
        Text="{Binding Path=., Converter={StaticResource valueFormattingConverter }}"
          IsEditable="True" />

因此,使用Combo示例,使用XmlElement调用valueFormattingConverter.Convert(yay!)。使用DataGridTextColumn示例,使用空字符串调用它。

编辑:正在进行的研究指出IMultiValueConverter是我可能想要的东西。

1 个答案:

答案 0 :(得分:0)

这很有效,但很乏味。我需要在每列中的DataGridTextColumn.Binding之间重新创建所有内容,每次更改XPath时都要更改。

如果有人能提出更好的方法,那么奖品就是开放的。

  <W3V:UnitsConverter x:Key="unitsConverter" />

...

    <DataGridTextColumn Header="Length">
      <DataGridTextColumn.Binding>
        <MultiBinding Converter="{StaticResource unitsConverter}">
          <Binding XPath="length/@value"/>
          <Binding XPath="length/@type"/>
          <Binding XPath="length/@units"/>
        </MultiBinding>
      </DataGridTextColumn.Binding>
    </DataGridTextColumn>

...

[ValueConversion(typeof(XmlElement), typeof(string))]
public class UnitsConverter : IMultiValueConverter
{

object IMultiValueConverter.Convert(object[] value, Type targetType, 
                   object parameter, System.Globalization.CultureInfo culture)
{
  if (value == null) return new List<string>();

  string data = value[0] as string;
  string type = value[1] as string;
  string unit = value[2] as string;

  return Information.FormatValue(data, type, unit);

}
....
}