Я новичок в WPF и люблю его. Однако у меня есть проблема с макетом, которая, надеюсь, поможет мне. Мне нужно создать редактор атрибутов лиц. Они состоят из 2 фиксированных атрибутов - имя и фамилия, а также переменная группа других атрибутов, таких как возраст, пол и т.д.
Я построил диалог, состоящий из сетки, которая содержит 2 текстовых поля для фиксированных атрибутов и список для переменных атрибутов.
<Grid Name="mainGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Label Grid.Column="0" Grid.Row="0" VerticalAlignment="Center">First Name:</Label>
<TextBox Name="tbFirstName" Grid.Column="2" Grid.Row="0" MinWidth="100" Margin="5" Text="{Binding Path=FirstName}"/>
<Label Grid.Column="0" Grid.Row="1" VerticalAlignment="Center">Last Name:</Label>
<TextBox Name="tbLastName" Grid.Column="2" Grid.Row="1" MinWidth="100" Margin="5" Text="{Binding Path=LastName, UpdateSourceTrigger=PropertyChanged}"/>
<ListBox Name="lstAttributes" Grid.Row="2" Grid.ColumnSpan="3" ItemsSource="{Binding Path=Attributes, UpdateSourceTrigger=PropertyChanged}"/>
<StackPanel Orientation="Horizontal" Grid.Row="3" Grid.ColumnSpan="3" HorizontalAlignment="Right">
<Button Name="btnOk" IsDefault="True" Click="btnOk_Click" Grid.Column="0" Grid.Row="2" MinWidth="60" Margin="5">Ok</Button>
<Button Name="btnCancel" IsCancel="True" Grid.Column="0" Grid.Row="2" MinWidth="60" Margin="5">Cancel</Button>
</StackPanel>
</Grid>
У меня есть слой данных, который возвращает объект person, связанный. Это содержит список атрибутов
который привязывается к списку. Для поддержки атрибутов разных типов они являются производными от общего базового класса. то есть IntegerAttribute: AttributeBase используется для представления атрибута 'Age'.
Затем я использую шаблоны данных для визуализации правильных элементов управления в зависимости от типа атрибута:
<Window.Resources>
<DataTemplate DataType="{x:Type reg:IntegerAttribute}">
<StackPanel Orientation="Horizontal">
<TextBlock Grid.Column="1" Text="{Binding Name}"/>
<TextBox Grid.Column="3" Text="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type reg:TextAttribute}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"/>
<TextBox Text="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type reg:SingleChoiceAttribute}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"/>
<ComboBox ItemsSource="{Binding Path=Choices, UpdateSourceTrigger=PropertyChanged}" SelectedValue="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
Но здесь есть проблема. Я хочу, чтобы атрибуты набора переменных появлялись в тех же столбцах, что и фиксированные атрибуты. Я пытался использовать SharedSizeGroup, но, похоже, это не работает.
Большое спасибо,
NickD