@kodwi
https://moikrug.ru/kodwi

Как осуществить нестандартную привязку данных к DataGrid в WPF?

Имеется класс, в котором содержится List<byte[][]> свойство, где элемент списка представляет собой считанный из файла элемент (элемент - массив полей, каждый из которых содержит значение в виде массива байтов, количество полей у всех элементов одинаково), в виде двумерного массива a[][], в котором i - номер поля элемента, a[i] - значение i-ого поля в виде массива байтов. Байты полей интерпретируются разными типами (где-то хранятся байты строки, где-то - байты вещественного числа и т.д.), и для преобразования из байтов в строку и из строки в байты с учетом типа поля реализованы соответствующие функции.

Мне необходимо реализовать вывод / редактирование / добавление / удаление элементов из List<byte[][]> свойства объекта данного класса в DataGrid. Поля элементов должны быть представлены не столбцами, а строками.

Я в курсе насчет стандартной привязки к DataGrid через создание отдельного класса и прикручивание его ObservableCollection к DataGrid, но у меня список элементов, который необходимо отображать в DataGrid, лежит внутри одного объекта, и элементы - не объекты класса, а двумерные массивы.

Насколько я знаю, без привязки, чисто программно на событиях оперировать действиями над строками DataGrid'a нельзя. Возможно ли как-то по-другому работать через DataGrid с моими данными в текущем виде? Если да, то как?
  • Вопрос задан
  • 4666 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Sumor
Предлагаю воспользоваться не датагридом, а ItemsControl для вывода списка ваших параметров.
Внешний ItemsControl перечисляет свойство класса типа List, второй ItemsControl — элемент этого списка типа byte[][], третий — byte[] и отображает TextBox для каждой цифры.
За счёт связывания (Binding) вы меняя значения в текстбоксах, меняете его в свойстве вашего объекта.

Xaml:
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ItemsControl x:Name="itemsData">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <ItemsControl BorderBrush="Black" BorderThickness="1" ItemsSource="{Binding}">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <ItemsControl BorderBrush="Black" BorderThickness="1" ItemsSource="{Binding}">
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <StackPanel  Orientation="Horizontal"/>
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate>
                                            <TextBox Text="{Binding Path=.}" />
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                </ItemsControl>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</Window>


C#
namespace WpfApplication1
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            var my = new MyClass();
            my.Data = new List<byte[][]>();
            my.Data.Add(new byte[][] { new byte[] { 0, 1 }, new byte[] { 2, 3 }, new byte[] { 4, 5 } });
            my.Data.Add(new byte[][] { new byte[] { 6, 7 }, new byte[] { 8, 9 }, new byte[] { 10, 11 } });
            itemsData.ItemsSource = my.Data;
        }

    }

    public class MyClass
    {
        public List<byte[][]> Data
        { get; set; }
    }
}
Ответ написан
Комментировать
@p1x
Мне кажется, что лучше всего создать ViewModel, который с одной стороны биндится в DataGrid, а с другой - синхронизируется с вашей коллекцией. Из альтернативных вариантов, могу предложить попробовать испоьзовать ListView c GridView или события DataGrid.CellEditEnding и DataGrid.RowEditEnding.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы