Один из вариантов: Wrap PropertyInfo в PropertyInfoViewModel так можно привязать его значение:
class PropertyInfoViewModel
{
Object CRUDObject { get; set; }
PropertyInfo PropertyInfo { get; set; }
Object Value {
get
{
return PropertyInfo.GetValue(CRUDObject);
}
set
{
PropertyInfo.SetValue(CRUDObject, value);
}
}
}
Вы могли бы иметь ObservableCollection в вашем CRUDObjectViewModel, заселенной при ее создании или изменении CRUD он прилагается к (Посмотрите на отражение, если смутитесь этим).
Используйте селектор шаблона, чтобы выбрать конкретный редактор для отображения на PropertyInfoViewModel:
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;
}
}
Вы могли бы использовать его как это:
<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>
Возможно, придется думать о том, как иметь дело с изменениями/updates, так как это не использует NotifyPropertyChanged, чтобы обновлять пользовательский интерфейс.
Я не проверял ничего из этого, но он должен работать, я думаю.
Как вы бы описали их в своей программе? – Clemens
Я голосовал, чтобы закрыть этот вопрос как «слишком широкий». Однако вы всегда можете установить или привязать свойство DisplayMemberPath ListBox. – Clemens
Код позади отлично в MVVM. Это должно касаться только логики пользовательского интерфейса. В этом случае я бы посоветовал вам захватить элемент управления «Property Editor» от одного из многих сторонних поставщиков решений/проектов с открытым исходным кодом. Редактор свойств берет объект и создает пользовательский интерфейс для редактирования значений свойств на нем. Это общий шаблон, но в WPF нет ни одного запеченного. – Will