Как отобразить и связать в WPF переменное число (и тип) атрибутов данных - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть тип объекта (назовите его «транспортное средство»), который может иметь переменное количество атрибутов, каждый из которых имеет свой тип (некоторые атрибуты - это одно число, некоторые - три числа в одном атрибуте).Порядок атрибутов имеет значение (это геометрические преобразования).

Я собрал атрибуты класса транспортного средства в коллекцию List.Краткий обзор классов (Предположим, что это все свойства с базовыми полями):

* См. Редактирование ниже *

class Transformation 
{
    string Type;   // Might make sense to make this an enum
    float[] Value; // This always holds either 1, 3, or 5 values depending on Type.
}

class Vehicle 
{
    List<Transformation> MyTransformations;
}

Когда я выбираю конкретный vehicle Например, я хотел бы отобразить преобразования на панели данных и связать их, чтобы пользователь мог их редактировать (и добавлять / удалять преобразования).

Какова лучшая стратегия для реализации этого в WPF?Я строю прокручиваемый StackPanel через код?Есть ли «умный» способ сделать это с помощью шаблонов типов?Является ли ошибкой удерживать преобразования разной длины в одном классе (нужно ли разбивать их на разные классы для каждого типа преобразования)?

Я предполагаю, что панель данных будет выглядеть примерно так:

<b>Transformations</b> 
Rotate       6.7  2.3  8.7 
UniformScale 1.0 
Translate    2.2  2.0  1.0

С полосой прокрутки, работающей с правой стороны, так как я не знаю, сколько преобразований может иметь каждый объект.

* Редактировать * За предложение вкомментарий и дальнейшие эксперименты, я сделал 3 отдельных класса для 3 видов атрибутов.Все они получены из Transformation, так что у меня все еще есть List<Transformation> в моем Vehicle классе.

Так что мой вопрос сейчас состоит в том, как создать прокручиваемый дисплей, который содержит переменное число Transformation объекты?

1 Ответ

0 голосов
/ 07 мая 2018

Я придумала одно потенциальное решение, основанное на комментарии @ PMV. Как упоминалось в «Редактировании моего исходного вопроса», у меня есть List<Transformation> для хранения моего списка преобразований и три различных класса преобразований, полученных из базы Transformation. Каждый из трех классов имеет свой тип Value. (Может быть float или один из двух созданных мной специальных классов, которые могут хранить 3 или 5 чисел с плавающей запятой - не в массиве).

Затем я создал 3 пользовательских элемента управления, по одному для каждого из трех производных классов. Пользовательские элементы управления представляют собой базовую «сетку» с текстовым полем для каждого float. Пример для типа данных 3 float показан ниже:

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
        </Grid.ColumnDefinitions>
        <TextBox x:Name="Type" 
            Grid.Column="0" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
            Text="{Binding .Type, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" 
        />
        <TextBox x:Name="X" 
            Grid.Column="1" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
            Text="{Binding .TransValue.X, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" 
        />
        <TextBox x:Name="Y" 
            Grid.Column="2" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
            Text="{Binding .TransValue.Y, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" 
        />
        <TextBox x:Name="Z" 
            Grid.Column="3" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
            Text="{Binding .TransValue.Z, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" 
        />

</Grid>

На своей главной странице я создал ListView с шаблонами данных для каждого из 3 классов преобразования, которые у меня есть. Двухстороннее связывание работает, как и ожидалось, и дисплей выглядит превосходно, при этом отображается любая комбинация производных объектов Transformation. Код для создания ListView:

   <ListView x:Name="listView">  
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.Resources>    
            <DataTemplate DataType="{x:Type mdl:Trans1}">
                <UserControls:UserControlTrans1/>
            </DataTemplate>                   
            <DataTemplate DataType="{x:Type mdl:Trans3}">
                <UserControls:UserControlTrans3/>
            </DataTemplate>    
        </ListView.Resources>    
    </ListView>

Одной важной деталью является свойство HorizontalContentAlignment. Это растягивает пользовательские элементы управления на всю ширину списка, что делает список красивым и равномерным, в отличие от каждой записи, имеющей элемент разной ширины.

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