具有未知类型的CRUD操作

时间:2016-06-30 15:49:19

标签: wpf mvvm crud

我正在尝试创建一个程序,为您提供任何对象的List的CRUD接口。这包括:

  1. 在ListBox中显示所有属性

  2. 插入新对象的能力

  3. 更新对象的能力

  4. 删除对象的能力

  5. 请记住,在编译时,我不知道我得到了什么样的对象。例如,我想为ListBox的DataTemplate中列出的每个属性都有一个TextBlock。那么如果我不知道属性的名称,我将如何进行数据绑定?另外,当我不知道属性名称时,如何生成插入表单?

    最后,是否有可能使用纯MVVM模式,没有任何Code-Behind?

    由于

2 个答案:

答案 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和业务逻辑,因此它需要相对最少的编码工作,同时保持定制其行为的可能性。