ich auf diesen Beitrag kam heute, während die gleiche Frage haben, die Antworten in diesem Thread mit ich mit einer überschaubaren Lösung zu einfachen Text/Textpaare aufkam. Um neue Felder hinzuzufügen, erweitern Sie einfach die Sammlung "FormItems".
xmlns: c = "clr-namespace: System.Collections; Montage = mscorlib"
<Window.Resources>
<c:ArrayList x:Key="FormItems">
<c:DictionaryEntry Key="First Name" Value="John"/>
<c:DictionaryEntry Key="Last Name" Value="Smith"/>
</c:ArrayList>
</Window.Resources>
<ItemsControl ItemsSource="{StaticResource FormItems}" Grid.IsSharedSizeScope="True">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Label"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock>
<Run Text="{Binding Key}"/><Run Text=": "/>
</TextBlock>
<TextBox Grid.Column="1" Text="{Binding Value}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Es gibt keine Rücksicht auf die Margen und Polsterung gewesen ist, es zeigt nur das Konzept Verwenden eines DataTemplate, um das Layout jedes Elements wiederzuverwenden. Es kann relativ einfach angepasst werden, um andere Datentypen und Steuerelemente einzubeziehen. Sie können sogar den ItemTemplateSelector verwenden, um basierend auf dem Typ des DictionaryEntry eine andere Vorlage auszuwählen.Wert
EDIT
Ein anderer Ansatz, fand ich, dass es einfacher für Databinding Visual Studio zu verwenden, war eine neue WPF „Custom Control“ zu erstellen. Dadurch wird eine neue Datei mit dem Namen Designs/Generic.xaml mit einem neuen Standardlayout erstellt. Ein paar einfache Änderungen und wir können das ItemsControl verwenden, um unser neues Steuerelement anzuzeigen.
Neue Klasse:
public class FormControlItem : ContentControl
{
public object Field {
get { return base.GetValue(FieldProperty); }
set { base.SetValue(FieldProperty, value); }
}
static FormControlItem() {
DefaultStyleKeyProperty.OverrideMetadata(
typeof(FormControlItem),
new FrameworkPropertyMetadata(typeof(FormControlItem)));
}
public static readonly DependencyProperty FieldProperty =
DependencyProperty.Register(
"Field",
typeof(object),
typeof(FormControlItem),
new FrameworkPropertyMetadata());
}
Themen/generic.xaml:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyApplication">
<Style TargetType="{x:Type local:FormControlItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:FormControlItem}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Label"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ContentPresenter ContentSource="Field"/>
<ContentPresenter Grid.Column="1" ContentSource="Content"/>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
Anwendungsbeispiel:
<ItemsControl Grid.IsSharedSizeScope="True">
<local:FormControlItem Field="Name: ">
<TextBox Text="{Binding Path=Name}"/>
</local:FormControlItem>
<local:FormControlItem Field="Type: ">
<ComboBox
SelectedItem="{Binding Path=Type}"
ItemsSource="{Binding Path=TypeValues}"/>
</local:FormControlItem>
<local:FormControlItem Field="Category: ">
<TextBox Text="{Binding Path=Category}"/>
</local:FormControlItem>
</ItemsControl>
nette Lösung, aber es ist unhöflich, wie viel XAML Sie brauchen. Und was ist mit der Leistung? – GorillaApe