如何通过用户请求调用IValueConverter? [XamDataGrid记录索引]

我想在我的XamDataGrid控件中添加像MS Excel这样的记录索引。我使用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实例中添加记录时,这非常有效,但是当我按照数据网格中的任何字段对数据进行排序时,记录索引也会排序(当我按下排序按钮时,值转换器不会调用)。也许我可以手动调用它? 感谢您的任何建议,抱歉我的英语不好。     
已邀请:

bab

通过DataBinding访问(获取/设置)属性时发生值转换。你排序并没有触发这个,我不怀疑你想要它,因为你的排序可能不适用于原始集合,你可能会再次获得带有错误行索引的项目。除了明确触发绑定刷新之外,我不知道让ValueConverter实现工作。 有关显式调用UpdateSource方法的信息,请查看此MSDN文章。我不知道这是否会解决您的问题,除非您使用LINQ对原始对象集合进行排序。     
我在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++;
就这样。祝好运 :)。     

要回复问题请先登录注册