DataTemplate не распознается для элементов DataGrid - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь создать матричное представление в WPF, используя элемент управления DataGrid. Я заполняю свой список источников предметов таблицей данных, доступной через конвертер. Каждая строка является массивом пользовательского типа класса (MatrixCell). В xaml на своей вкладке ресурсов я создаю DataTemplate для моего типа, MatrixCell, но при запуске приложения он не применяется. Кто-нибудь знает, что я делаю неправильно?

Моя DataGrid:

<DataGrid
            CanUserAddRows="False" 
            CanUserDeleteRows="False" 
            CanUserReorderColumns="False" 
            CanUserSortColumns="False" 
            CanUserResizeColumns="False"
            SelectionUnit="Cell"
            IsReadOnly="True"
            Name="matrixGrid">
            <DataGrid.ItemsSource>
                <Binding Path="Test" Converter="{StaticResource MatrixToDataViewConverter}"/>
            </DataGrid.ItemsSource>
            <DataGrid.ColumnHeaderStyle>
                <Style TargetType="{x:Type DataGridColumnHeader}" BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
                    <Setter Property="LayoutTransform">
                        <Setter.Value>
                            <TransformGroup>
                                <RotateTransform Angle="270"/>
                            </TransformGroup>
                        </Setter.Value>
                    </Setter>
                </Style>
            </DataGrid.ColumnHeaderStyle>
        </DataGrid>

Мой конвертер:

public class MatrixToDataViewConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var myDataTable = new System.Data.DataTable();
            if(value != null)
            {
                var test = value as ITest;
                myDataTable.Columns.Add("-");
                foreach (var column in test.Columns)
                {
                    //populate columns
                    //...
                }

                var rows = new List<List<MatrixCell>>();
                foreach (var matrixRow in test.MatrixRows)
                {
                    var row = new List<MatrixCell>();
                    row.Add(new MatrixCell() { Content = $"{matrixRow.Id} {matrixRow.Name}" });
                    var temp = new MatrixCell[1 + test.Columns.Count];
                    foreach (var column in test.Columns)
                    {
                        //determine the Content value for each MatrixCell
                        //...
                        row.Add(new MatrixCell() { Content = content });
                    }

                    row.CopyTo(temp);
                    myDataTable.Rows.Add(temp);
                }
            }
            return myDataTable.DefaultView;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

Класс MatrixCell:

public class MatrixCell
    {
        public string Content { get; set; }

        public bool IsComparerDone { get; set; }

        //public override string ToString()
        //{
        //    return Content;
        //}
    }

DataTemplate:

<DataTemplate DataType="{x:Type viewModels:MatrixCell}">
            <TextBlock Text="{Binding Content}">
                <!--<TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IsComparerResult}" Value="True">
                                <Setter Property="Background" Value="Yellow"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>-->
            </TextBlock>
</DataTemplate>

Просто для отображения MatrixCell.Content Я могу переопределить метод ToString, и он работает, но я хотел бы сделать это с помощью DataTemplate.

Это как выглядит мое текущее приложение: матричное представление

1 Ответ

0 голосов
/ 31 марта 2020

Добро пожаловать на ТАК! Для дальнейшего использования вы получите гораздо лучшие ответы, если предоставите MVCE , но я постараюсь помочь ...

Вам не нужен этот конвертер. Просто привяжите к своему списку напрямую и объявите столбец типа DataGridTemplateColumn явно. Затем внутри этого места поместите ContentControl и свяжите его свойство Content с его текущим DataContext (т.е. Content="{Binding}"). Затем ContentControl подберет ваш DataTemplate и заполнится соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...