WPF Преобразование XML-элементов в содержимое DataGrid

РЕДАКТИРОВАТЬ: я открыт для другого подхода. Исходными данными является XML, но, безусловно, есть и другие способы заставить сетку данных работать.

Этот ответ заставил меня начать, но кажется, что в 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 метод valueFormattingConverter.Convert вызывается с XmlElement (ура!). В примере с DataGridTextColumn он вызывается с пустой строкой.

РЕДАКТИРОВАТЬ: текущие исследования указывают на то, что IMultiValueConverter мне может понадобиться.


person Alan Baljeu    schedule 25.02.2015    source источник


Ответы (1)


Это работает, но утомительно. Мне нужно переделать все между 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);

}
....
}
person Alan Baljeu    schedule 26.02.2015