Как я могу позвонить IValueConverter по запросу пользователя?[Индекс записи XamDataGrid] - PullRequest
0 голосов
/ 26 марта 2011

Я хочу добавить индекс записи, такой как MS Excel, в свой элемент управления XamDataGrid.Я использую для этого трюк с IValueConverter.Я определяю некоторый шаблон для отображения ширины индексов записей в этом XAML-коде:

<local:RowNumberConverter x:Key="rowNumberConverter" />

    <Style TargetType="{x:Type igDP:RecordSelector}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type igDP:RecordSelector}">
                    <TextBlock>
                            <TextBlock.Text>
                                <MultiBinding Converter="{StaticResource rowNumberConverter}">
                                    <Binding />
                                    <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type igDP:XamDataGrid}}"/>
                                </MultiBinding>
                            </TextBlock.Text>
                    </TextBlock>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

RowNumberConverter, определяемый как:

class RowNumberConverter : IMultiValueConverter {
      #region IMultiValueConverter Members

      public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) {

         //get the grid and the item
         Object item = values[0];
         XamDataGrid grid = values[1] as XamDataGrid;

         int index = grid.RecordManager.Unsorted.IndexOf(((DataRecord)item));

         return index.ToString();
      }

      public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) {
         throw new NotImplementedException();
      }

      #endregion
   }

Это прекрасно работает, когда я добавляю записи в мой экземпляр XamDataGrid, но когдаЯ сортирую данные по любому полю в моей таблице данных, индексы записей также сортируются (преобразователь значений не вызывает, когда я нажимаю кнопку сортировки).Может быть, я могу позвонить вручную?

Спасибо за любые советы и извините за мой плохой английский.

Ответы [ 2 ]

1 голос
/ 31 марта 2011

Я нашел решение с помощью поддержки Infragistics. Он сочетает в себе несколько методов. Итак ...

Запись MultiValueConverter:

открытый класс RowNumberConverter: IMultiValueConverter {

   #region IMultiValueConverter Members

   public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
   {
       if (values != null && values[0] != null)
       {
           Record r = values[0] as Record;
           return (r.VisibleIndex + 1).ToString();
       }
       else
           return null;
   }

   public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
   {
       throw new NotImplementedException();
   }
   #endregion

}

Регистрация DepencyProperty:

public static readonly DependencyProperty DummyValueProperty =

      DependencyProperty.Register("DummyValue", typeof(int), typeof(XamRibbonWindow), new UIPropertyMetadata(0));

        public int DummyValue
        {
            get { return (int)GetValue(DummyValueProperty); }
            set { SetValue(DummyValueProperty, value); }
        }

Стиль записи:

<Style TargetType="{x:Type igDP:RecordSelector}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type igDP:RecordSelector}">
                    <Border BorderBrush="#FFD4D4D4" BorderThickness="0,1.5,1.5,0" Background="#FFF1F1F1">
                        <TextBlock HorizontalAlignment="Center" Margin="0" TextWrapping="Wrap" VerticalAlignment="Center" FontSize="{Binding Path=FontSize, RelativeSource={RelativeSource AncestorType={x:Type igDP:XamDataGrid}}}">
                                <TextBlock.Text>
                                    <MultiBinding Converter="{StaticResource ResourceKey=rowNumberConverter}">
                                        <Binding />
                                        <Binding Path="DummyValue" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}"/>
                                    </MultiBinding>
                                </TextBlock.Text>
                        </TextBlock>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="MinWidth" Value="50"/>
    </Style>

Добавьте обработчики событий для сортировки событий, удаления событий и т. Д. С помощью этого кода:

this.DummyValue++;

Вот и все. Удачи:).

1 голос
/ 26 марта 2011

Преобразование значений происходит, когда к свойствам обращаются (получают / устанавливают) через DataBinding. Вы сортируете, а не инициируете это, и я не подозреваю, что вы этого хотите, поскольку ваша сортировка, вероятно, не работает с исходной коллекцией, и вы, вероятно, снова получите элементы с неправильным индексом строки. В любом случае, кроме явного запуска обновления привязки, я не знаю, как заставить реализацию ValueConverter работать.

Проверьте в этой статье MSDN для получения информации о явном вызове метода UpdateSource. Я не знаю, решит ли это вашу проблему, если вы не отсортируете исходную коллекцию объектов с помощью LINQ.

...