2016-06-30 4 views
0

Я пытаюсь создать программу, которая дает вам интерфейс CRUD для списка любых объектов, которые вы ему даете. Это включает в себя:Операции CRUD с неизвестным типом

  1. Показаны все их свойства внутри ListBox

  2. Возможность вставить новый объект

  3. Возможность обновить объект

  4. Возможность удаления объект

Имейте в виду, что во время компиляции я понятия не имею, какие объекты я получаю. Например, я хочу иметь TextBlock для каждого из свойств, просто перечисленных в DataTemplate ListBox. Итак, как мне сделать привязку данных, если я не знаю названия свойства? Кроме того, как мне создать форму вставки, когда я не знаю имена свойств?

И, наконец, возможно ли это сделать с использованием чистого шаблона MVVM без кода?

Благодаря

+0

Как вы бы описали их в своей программе? – Clemens

+1

Я голосовал, чтобы закрыть этот вопрос как «слишком широкий». Однако вы всегда можете установить или привязать свойство DisplayMemberPath ListBox. – Clemens

+0

Код позади отлично в MVVM. Это должно касаться только логики пользовательского интерфейса. В этом случае я бы посоветовал вам захватить элемент управления «Property Editor» от одного из многих сторонних поставщиков решений/проектов с открытым исходным кодом. Редактор свойств берет объект и создает пользовательский интерфейс для редактирования значений свойств на нем. Это общий шаблон, но в WPF нет ни одного запеченного. – Will

ответ

0

Один из вариантов: 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, чтобы обновлять пользовательский интерфейс.

Я не проверял ничего из этого, но он должен работать, я думаю.

0

Этот элемент управления WPFCrudControl может соответствовать вашей проблеме.

Общий WPF CrudControl реализован на основе шаблона MVVM. Это дает огромный прирост производительности для простых операций CRUD (добавление, редактирование, удаление, проверка, листинг с сортировкой, поиском и поиском). Элемент управления абстрагирует как пользовательский интерфейс, так и бизнес-логику, поэтому он требует относительно минимальных усилий по кодированию, сохраняя при этом возможность настроить его поведение.

+1

Для того, чтобы достичь upvotes в ваших ответах, вы должны добавить немного больше контента.Понимаете, ссылки могут сломаться в будущем. поэтому всегда полезно дать некоторый контент/цитату/... непосредственно в вашем ответе. – GhostCat

+0

ОК, Спасибо, я отредактирую его. –

Смежные вопросы