none
Binding special nested property in datagrid RRS feed

  • 问题

  • 如下类
     public class Member {
         public string Name { get; set; }
         public string Age { get; set; }
         public IList<Book> Books { get; set;}
       }

       public class Book{
         public string name { get; set; }
       }

     .xaml.cs

     ObservableCollection<Member> memberData = new ObservableCollection<Member>(); 
    希望实现

    姓名     年龄    书籍
    小张     12      《2》
    小李     12      《2》

    问题来了,对于书籍这一列,我期望的是绑定IList<Book> 中指定的Book,比如Books[2],2是可以写死的。

    希望大虾们不要让我修改class Member,需求中这个class 不让做任何改动。先谢谢了。
    2014年2月13日 0:22

答案

  • Hi, 可以使用值转换器,如下所示:

    xaml:

            <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" Name="dataGrid">
                <DataGrid.Resources>
                    <local:BookNameConvertor x:Key="BookNameConvertor"/>
                </DataGrid.Resources>
                <DataGrid.Columns>
                    <DataGridTextColumn Header="姓名" Binding="{Binding Name }"/>
                    <DataGridTextColumn Header="年龄" Binding="{Binding Age }"/>
                    <DataGridTextColumn Header="书籍" Binding="{Binding Books, Converter={StaticResource BookNameConvertor}}"/>
                </DataGrid.Columns>
            </DataGrid>

    转换器代码

        public class BookNameConvertor : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                IList<Book> books = value as IList<Book>;
                if (null != books && books.Count > 2)
                {
                    return books[2].name;
                }
    
                return null;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return null;
            }
        }

    绑定数据:

                dataGrid.DataContext = memberData;
    

    • 已标记为答案 shimingsg 2014年2月13日 5:51
    2014年2月13日 3:38

全部回复

  • Hi, 可以使用值转换器,如下所示:

    xaml:

            <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" Name="dataGrid">
                <DataGrid.Resources>
                    <local:BookNameConvertor x:Key="BookNameConvertor"/>
                </DataGrid.Resources>
                <DataGrid.Columns>
                    <DataGridTextColumn Header="姓名" Binding="{Binding Name }"/>
                    <DataGridTextColumn Header="年龄" Binding="{Binding Age }"/>
                    <DataGridTextColumn Header="书籍" Binding="{Binding Books, Converter={StaticResource BookNameConvertor}}"/>
                </DataGrid.Columns>
            </DataGrid>

    转换器代码

        public class BookNameConvertor : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                IList<Book> books = value as IList<Book>;
                if (null != books && books.Count > 2)
                {
                    return books[2].name;
                }
    
                return null;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return null;
            }
        }

    绑定数据:

                dataGrid.DataContext = memberData;
    

    • 已标记为答案 shimingsg 2014年2月13日 5:51
    2014年2月13日 3:38
  • 谢谢你。 问题解决了。
    2014年2月13日 5:52