Eine Option: Wickelproperty in einem PropertyInfoViewModel so können Sie binden an seinen Wert:
class PropertyInfoViewModel
{
Object CRUDObject { get; set; }
PropertyInfo PropertyInfo { get; set; }
Object Value {
get
{
return PropertyInfo.GetValue(CRUDObject);
}
set
{
PropertyInfo.SetValue(CRUDObject, value);
}
}
}
Sie eine ObservableCollection in Ihrem CRUDObjectViewModel haben könnte, aufgefüllt, wenn Sie es schaffen oder die CRUD ändern es ist an (Nachschlagen, wenn es dadurch verwirrt wird).
eine Vorlage Selektor Verwenden Sie für die PropertyInfoViewModel einen bestimmten Editor zur Auswahl angezeigt werden:
public class PropertyTypeTemplateSelector : DataTemplateSelector
{
public DataTemplate BooleanTemplate { get; set; }
public DataTemplate GuidTemplate { get; set; }
public DataTemplate StringTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
PropertyInfo propertyInfo = (item as PropertyInfoViewModel).PropertyInfo;
if (propertyInfo.PropertyType == typeof(Boolean))
{
return BooleanTemplate;
}
else if (propertyInfo.PropertyType == typeof(Guid))
{
return GuidTemplate;
}
else if (propertyInfo.PropertyType == typeof(String))
{
return StringTemplate;
}
return null;
}
}
Sie es wie folgt verwenden:
<ListBox ItemsSource="{Binding Properties}">
<ListBox.Resources>
<DataTemplate x:Key="BooleanTemplate">
<CheckBox Content="{Binding PropertyInfo.Name}" IsChecked="{Binding Value}"/>
</DataTemplate>
<DataTemplate x:Key="GuidTemplate">
<StackPanel>
<TextBox Text="{Binding PropertyInfo.Name}"/>
<TextBox Text="{Binding Value, ValueConverter={StaticResources MyGuidConverter}}"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="StringTemplate">
<StackPanel>
<TextBox Text="{Binding PropertyInfo.Name}"/>
<TextBox Text="{Binding Value}"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="Null"/>
</ListBox.Resources>
<ListBox.ItemTemplateSelector>
<helpers:PropertyTypeTemplateSelector BooleanTemplate="{StaticResource BooleanTemplate}"
GuidTemplate="{StaticResource GuidTemplate}"
StringTemplate="{StaticResource StringTemplate}"/>
</ListBox.ItemTemplateSelector>
</ListBox>
könnte darüber nachdenken, wie man mit Änderungen umgehen/updates, da NotifyPropertyChanged nicht verwendet wird, um die Benutzeroberfläche auf dem neuesten Stand zu halten.
Ich habe nichts davon getestet, aber es sollte funktionieren, denke ich.
Wie würden Sie die Objekte Ihrem Programm "geben"? – Clemens
Ich habe gewählt, um diese Frage als "zu breit" zu schließen. Sie können jedoch die DisplayMemberPath-Eigenschaft einer ListBox immer festlegen oder binden. – Clemens
Code hinten ist in MVVM völlig in Ordnung. Es sollte sich nur mit der UI-Logik befassen. In diesem Fall würde ich vorschlagen, dass Sie einen "Property Editor" von einem der vielen 3rd-Party-Control-Anbieter/Open-Source-Projekte greifen. Ein Eigenschafteneditor übernimmt ein Objekt und erstellt eine Benutzeroberfläche zum Bearbeiten von Eigenschaftswerten. Es ist ein übliches Muster, aber es gibt kein in WPF gebackenes Muster. – Will