【问题标题】:How can I call IValueConverter by user request? [XamDataGrid record index]如何根据用户请求调用 IValueConverter? [XamDataGrid 记录索引]
【发布时间】:2011-03-26 19:41:54
【问题描述】:

我想在我的 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 实例中添加记录时,这非常有效,但是当我按数据网格中的任何字段对数据进行排序时,记录索引也会排序(当我按下排序按钮时,值转换器不会调用)。也许我可以手动调用它?

感谢您的任何建议,并为我的英语不好感到抱歉。

【问题讨论】:

    标签: wpf binding infragistics ivalueconverter xamdatagrid


    【解决方案1】:

    值转换发生在通过 DataBinding 访问(获取/设置)属性时。您正在排序不会触发此操作,我不怀疑您希望它触发,因为您的排序可能不适用于原始集合,并且您可能会再次获得具有错误行索引的项目。除了显式触发绑定刷新之外,我不知道如何让 ValueConverter 实现工作。

    查看this MSDN article 以获取有关显式调用 UpdateSource 方法的信息。我不知道这是否能解决您的问题,除非您使用 LINQ 对原始对象集合进行排序。

    【讨论】:

    • 不起作用是因为它不更新,或者它不改变网格中的行索引号?
    • 我相信这是因为这些项目以相同的顺序从源集合中出来,然后它们被排序。所以当他们被转换时,他们得到他们的行索引,然后他们被网格排序。您需要对源集合进行排序。
    • 但排序是 xamDataGrid 内置功能。感谢您的建议,但我无法将其标记为答案,因为也许有人知道 Infragistics xamDataGrid 组件的有效解决方案。谢谢!
    【解决方案2】:

    我在 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++;
    

    仅此而已。祝你好运:)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2021-03-24
      • 1970-01-01
      • 2018-01-13
      相关资源
      最近更新 更多