我正在尝试创建一个程序,为您提供任何对象的List的CRUD接口。这包括:
在ListBox中显示所有属性
插入新对象的能力
更新对象的能力
删除对象的能力
请记住,在编译时,我不知道我得到了什么样的对象。例如,我想为ListBox的DataTemplate中列出的每个属性都有一个TextBlock。那么如果我不知道属性的名称,我将如何进行数据绑定?另外,当我不知道属性名称时,如何生成插入表单?
最后,是否有可能使用纯MVVM模式,没有任何Code-Behind?
由于
答案 0 :(得分:0)
一个选项:在PropertyInfoViewModel中包装PropertyInfo,以便绑定它的值:
class PropertyInfoViewModel
{
Object CRUDObject { get; set; }
PropertyInfo PropertyInfo { get; set; }
Object Value {
get
{
return PropertyInfo.GetValue(CRUDObject);
}
set
{
PropertyInfo.SetValue(CRUDObject, value);
}
}
}
您可以在CRUDObjectViewModel中创建一个ObservableCollection,在创建它时填充或更改它附加的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>
可能必须考虑如何处理更改/更新,因为这不是使用NotifyPropertyChanged来保持UI更新。
我没有对此进行过任何测试,但我认为它应该可行。
答案 1 :(得分:0)
此控件WPFCrudControl可能适合您的问题。
基于MVVM模式实现的通用WPF CrudControl。它为简单的CRUD操作(添加,编辑,删除,验证,列表排序,分页和搜索)提供了巨大的生产力提升。该控件抽象了UI和业务逻辑,因此它需要相对最少的编码工作,同时保持定制其行为的可能性。