none
DataGrid绑定数据,与非绑定生成列的处理 RRS feed

  • 问题

  • 我有一个Datagrid用于显示数据,显示的列是绑定到自定义类的属性上的,但是有些列是通过其他列计算出来的,不知道该怎么处理。

    通过修改自定义类添加计算列的属性可以实现,但是我这里不能采用这个方法处理,原因我就不说了...应该是还有其他比较简单的处理方式的,请各位大侠指教小弟

    2013年2月19日 2:11

答案

  • 你好,

    如果不想添加自定义属性的话, 你可以尝试使用多重 绑定 ——“MultiBinding ”。将所有需要计算的列绑定到该列,并且自定义Converter类,在Convert()方法中对这些列进行计算并且返回计算的结果。

    例如:

    <TextBlock Name="textBox2" DataContext="{StaticResource NameListData}">
      <TextBlock.Text>
        <MultiBinding Converter="{StaticResource myNameConverter}"
                      ConverterParameter="FormatLastFirst">
          <Binding Path="FirstName"/>
          <Binding Path="LastName"/>
        </MultiBinding>
      </TextBlock.Text>
    </TextBlock>
    
    public class NameConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            string name;
    
            switch ((string)parameter)
            {
                case "FormatLastFirst":
                    name = values[1] + ", " + values[0];
                    break;
                case "FormatNormal":
                default:
                    name = values[0] + " " + values[1];
                    break;
            }
    
            return name;
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            string[] splitValues = ((string)value).Split(' ');
            return splitValues;
        }
    }
    


    Lisa Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 blwuer 2013年2月23日 7:38
    2013年2月21日 4:33
    版主

全部回复

  • 你好,

    WPF中并没有相应的build-in 方法来获取Datagrid中某个单元格的值,所以如果想要获取到并且进行处理的话是相对比较麻烦的。你 可以参考博客:

    wpf 中获取datagrid中的值 或者类似的讨论:http://social.msdn.microsoft.com/Forums/en/wpf/thread/74332b78-6bfd-4ac9-af85-dfd9bec87a29 .

    所以,相较而言,比较推荐你通过修改自定义类添加计算列的属性来实现这些列的数据显示。


    Lisa Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年2月20日 5:36
    版主
  • 你好,

    WPF中并没有相应的build-in 方法来获取Datagrid中某个单元格的值,所以如果想要获取到并且进行处理的话是相对比较麻烦的。你 可以参考博客:

    wpf 中获取datagrid中的值 或者类似的讨论:http://social.msdn.microsoft.com/Forums/en/wpf/thread/74332b78-6bfd-4ac9-af85-dfd9bec87a29 .

    所以,相较而言,比较推荐你通过修改自定义类添加计算列的属性来实现这些列的数据显示。


    Lisa Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    也就是说,我如果想实现计算列,修改自定义数据类是最简单的方法了?我这里就是不能修改自定义类,但是我可以添加一个新类包装自定义类和计算列属性这样使用这个新类作为数据绑定类就能解决计算列的问题了。这样对吗?难道真的就没有其他比较简洁的方法处理了吗?
    2013年2月21日 3:23
  • 你好,

    如果不想添加自定义属性的话, 你可以尝试使用多重 绑定 ——“MultiBinding ”。将所有需要计算的列绑定到该列,并且自定义Converter类,在Convert()方法中对这些列进行计算并且返回计算的结果。

    例如:

    <TextBlock Name="textBox2" DataContext="{StaticResource NameListData}">
      <TextBlock.Text>
        <MultiBinding Converter="{StaticResource myNameConverter}"
                      ConverterParameter="FormatLastFirst">
          <Binding Path="FirstName"/>
          <Binding Path="LastName"/>
        </MultiBinding>
      </TextBlock.Text>
    </TextBlock>
    
    public class NameConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            string name;
    
            switch ((string)parameter)
            {
                case "FormatLastFirst":
                    name = values[1] + ", " + values[0];
                    break;
                case "FormatNormal":
                default:
                    name = values[0] + " " + values[1];
                    break;
            }
    
            return name;
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            string[] splitValues = ((string)value).Split(' ');
            return splitValues;
        }
    }
    


    Lisa Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 blwuer 2013年2月23日 7:38
    2013年2月21日 4:33
    版主