none
DataGridView с привязкой к BindingSource. Как доавить калькулируемый столбец? RRS feed

  • Вопрос

  • DataGridView отображает информацию из списка на основе базового класса FileInfo. Но мне необходимо отображать информацию которой нет в виде свойств FileInfo, но я могу получить их на основе данных другх столбцов. Как мне реализовать такуй функциональность?

Ответы

  • В конвертор вы можете передавать как отдельное поле (указав Path), так и весь объект отображаемый в строке (Path не указывать), ну а имея в методе весь объект вы можете на основе его полей посчитать новое значение.

    Ну давайте конкретно ваш пример.

    Вот класс модели (есть дата рождения, но нет количества полных лет):

    class Person
    {
    	public string Name { get; set; }
    
    	public DateTime BirthDate { get; set; }
    }

    Вот конвертор:

    class AgeConvertor : IValueConverter
    {
    
    	public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    	{
    		Person p = value as Person;
    		if (p != null)
    		{
    			return (int)DateTime.Now.Subtract(p.BirthDate).TotalDays / 365;
    		}
    		return "-";
    	}
    
    	public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    	{
    		throw new NotImplementedException();
    	}
    }

    Вот xaml:

    <Grid>
    	<Grid.Resources>
    		<local:AgeConvertor x:Key="MyConvertor" />
    	</Grid.Resources>
    	<DataGrid x:Name="dgMain" AutoGenerateColumns="False" >
    		<DataGrid.Columns>
    			<DataGridTextColumn Header="Имя" Binding="{Binding Name}" />
    			<DataGridTextColumn Header="Возраст" Binding="{Binding Converter={StaticResource MyConvertor}}" />
    		</DataGrid.Columns>
    	</DataGrid>
    </Grid>

    Вот инициализация данными:

    List<Person> persons = new List<Person>();
    persons.Add(new Person() { Name = "Иван", BirthDate = new DateTime(1970, 3, 10) });
    persons.Add(new Person() { Name = "Петр", BirthDate = new DateTime(1980, 6, 10) });
    persons.Add(new Person() { Name = "Сидор", BirthDate = new DateTime(1990, 9, 10) });
    dgMain.ItemsSource = persons;

    Вот что на выходе:

    Как видите поля возраст в модели нет, а в датагриде есть.

    • Помечено в качестве ответа PhantomSL 22 мая 2012 г. 9:28
    Отвечающий

Все ответы

  • Добрый день.

    Используйте конверторы. Вот пример, как я на основе свойств объекта получал кисть, а вы можете аналогично получать производное значение.

    Отвечающий
  • Добрый день.

    Используйте конверторы. Вот пример, как я на основе свойств объекта получал кисть, а вы можете аналогично получать производное значение.

    На сколько я понял конвертеры позволяют по сути форматировать вывод данных. Разве они мне позволят получить значения соседних ячеек?

  • В конвертор вы можете передавать как отдельное поле (указав Path), так и весь объект отображаемый в строке (Path не указывать), ну а имея в методе весь объект вы можете на основе его полей посчитать новое значение.

    Ну давайте конкретно ваш пример.

    Вот класс модели (есть дата рождения, но нет количества полных лет):

    class Person
    {
    	public string Name { get; set; }
    
    	public DateTime BirthDate { get; set; }
    }

    Вот конвертор:

    class AgeConvertor : IValueConverter
    {
    
    	public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    	{
    		Person p = value as Person;
    		if (p != null)
    		{
    			return (int)DateTime.Now.Subtract(p.BirthDate).TotalDays / 365;
    		}
    		return "-";
    	}
    
    	public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    	{
    		throw new NotImplementedException();
    	}
    }

    Вот xaml:

    <Grid>
    	<Grid.Resources>
    		<local:AgeConvertor x:Key="MyConvertor" />
    	</Grid.Resources>
    	<DataGrid x:Name="dgMain" AutoGenerateColumns="False" >
    		<DataGrid.Columns>
    			<DataGridTextColumn Header="Имя" Binding="{Binding Name}" />
    			<DataGridTextColumn Header="Возраст" Binding="{Binding Converter={StaticResource MyConvertor}}" />
    		</DataGrid.Columns>
    	</DataGrid>
    </Grid>

    Вот инициализация данными:

    List<Person> persons = new List<Person>();
    persons.Add(new Person() { Name = "Иван", BirthDate = new DateTime(1970, 3, 10) });
    persons.Add(new Person() { Name = "Петр", BirthDate = new DateTime(1980, 6, 10) });
    persons.Add(new Person() { Name = "Сидор", BirthDate = new DateTime(1990, 9, 10) });
    dgMain.ItemsSource = persons;

    Вот что на выходе:

    Как видите поля возраст в модели нет, а в датагриде есть.

    • Помечено в качестве ответа PhantomSL 22 мая 2012 г. 9:28
    Отвечающий