2016-06-30 7 views
0

Ich versuche ein Programm zu erstellen, das Ihnen eine CRUD-Schnittstelle für die Liste aller Objekte gibt, die Sie ihm geben. Dazu gehören:CRUD-Operationen mit unbekanntem Typ

  1. alle ihre Eigenschaften in einem ListBox Zeige

  2. die Fähigkeit, ein neues Objekt

  3. Die Möglichkeit zum Einfügen von einem Objekt

  4. Die Fähigkeit, zu aktualisieren zu löschen ein Objekt

Bedenken Sie, dass ich zur Kompilierzeit keine Ahnung habe, welche Art von Objekten ich bekomme. Zum Beispiel möchte ich einen TextBlock für jede der Eigenschaften haben, die einfach in ListBox's DataTemplate aufgelistet sind. Also, wie würde ich die Datenbindung machen, wenn ich den Namen der Eigenschaft nicht kenne? Wie würde ich ein Einfügungsformular generieren, wenn ich die Eigenschaftsnamen nicht kenne?

Und schließlich ist es möglich, es mit reinem MVVM-Muster zu tun, ohne Code-Behind?

Dank

+0

Wie würden Sie die Objekte Ihrem Programm "geben"? – Clemens

+1

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

+0

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

Antwort

0

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.

0

Dieses Steuerelement WPFCrudControl passt möglicherweise zu Ihrem Problem.

Eine generische WPF-CrudControl implementiert basierend auf dem MVVM-Muster. Es bietet eine enorme Produktivitätssteigerung für einfache CRUD-Operationen (Hinzufügen, Bearbeiten, Löschen, Validieren, Auflisten mit Sortieren, Paging und Suchen). Das Steuerelement abstrahiert sowohl die Benutzeroberfläche als auch die Geschäftslogik. Daher ist ein relativ geringer Codierungsaufwand erforderlich, während das Verhalten angepasst werden kann.

+1

Um Antworten auf Ihre Antworten zu erhalten, sollten Sie etwas mehr Inhalt hinzufügen.Sie sehen, Links können an einem zukünftigen Punkt brechen; Daher ist es immer hilfreich, Inhalte/Zitate/... direkt in Ihrer Antwort anzugeben. – GhostCat

+0

ok, danke ich werde es bearbeiten. –

Verwandte Themen