none
DataGrid объединение 2-х ячеек RRS feed

  • Вопрос

  • Всем добрый день, помогите с решением вопроса, нужно объединить  2 ячейки в 1-ну,  приведу пример: 

    830/35        1407/102        830/74

    вот такой эффект хочу получить, разделяя данные через слеш. 

    Сейчас это выглядит вот так:

    830      1407      830

    35         102        74

    <DataGrid.Columns>
    <DataGridTextColumn Header="Вес(т)" Binding="{Binding P, StringFormat={}{0:0}}" />
    <DataGridTextColumn Header="Длина" Binding="{Binding L}" />
    </DataGrid.Columns>
    

    Всем спасибо

    18 ноября 2015 г. 10:29

Ответы

  • Код конвертора:

    class MyConverter : MarkupExtension, IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            var result = "-";
            if (values.Length == 2)
            {
                result = string.Format("{0}/{1}", values[0] ?? "-", values[1] ?? "-");
            }
            return result;
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return new MyConverter();
        }
    }


    Разметка формы:

    <Window x:Class="WpfApplication8.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication8"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid x:Name="grMain" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Вес(т)/Длина">
                        <DataGridTextColumn.Binding>
                            <MultiBinding Converter="{local:MyConverter}">
                                <Binding Path="P" />
                                <Binding Path="L" />
                            </MultiBinding>
                        </DataGridTextColumn.Binding>
                    </DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    

    Код формы (заполнение тестовыми данными):

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
        }
    
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            grMain.ItemsSource = new[] { new { P = 1000, L = 10 }, new { P = 420, L = 123 }, new { P = 1300, L = 45 } };
        }
    }

    Вот так выглядит:

    • Помечено в качестве ответа Ethernets 19 ноября 2015 г. 5:05
    18 ноября 2015 г. 13:55
    Отвечающий
  • Спасибо вам за помощь, нашел еще один пример как это реализовать без конвертера, кому нужно пример приведу ниже 
      <DataGridTemplateColumn Header="QuellPortfolio" SortMemberPath="QuellstammCode" >
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{Binding P, StringFormat={}{0:0}}"></TextBlock>
                                    <TextBlock Text="/"></TextBlock>
                                    <TextBlock Text="{Binding L}"></TextBlock>
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

    19 ноября 2015 г. 5:05

Все ответы

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

    Я бы использовал MultyBinding и конвертор.

    18 ноября 2015 г. 11:18
    Отвечающий
  • Примером не поделитесь пожалуйста ? (для чего нужен конвертор ?) 
    • Изменено Ethernets 18 ноября 2015 г. 12:25
    18 ноября 2015 г. 12:24
  • Код конвертора:

    class MyConverter : MarkupExtension, IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            var result = "-";
            if (values.Length == 2)
            {
                result = string.Format("{0}/{1}", values[0] ?? "-", values[1] ?? "-");
            }
            return result;
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return new MyConverter();
        }
    }


    Разметка формы:

    <Window x:Class="WpfApplication8.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication8"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid x:Name="grMain" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Вес(т)/Длина">
                        <DataGridTextColumn.Binding>
                            <MultiBinding Converter="{local:MyConverter}">
                                <Binding Path="P" />
                                <Binding Path="L" />
                            </MultiBinding>
                        </DataGridTextColumn.Binding>
                    </DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    

    Код формы (заполнение тестовыми данными):

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
        }
    
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            grMain.ItemsSource = new[] { new { P = 1000, L = 10 }, new { P = 420, L = 123 }, new { P = 1300, L = 45 } };
        }
    }

    Вот так выглядит:

    • Помечено в качестве ответа Ethernets 19 ноября 2015 г. 5:05
    18 ноября 2015 г. 13:55
    Отвечающий
  • Спасибо вам за помощь, нашел еще один пример как это реализовать без конвертера, кому нужно пример приведу ниже 
      <DataGridTemplateColumn Header="QuellPortfolio" SortMemberPath="QuellstammCode" >
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{Binding P, StringFormat={}{0:0}}"></TextBlock>
                                    <TextBlock Text="/"></TextBlock>
                                    <TextBlock Text="{Binding L}"></TextBlock>
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

    19 ноября 2015 г. 5:05