2016-03-21 12 views
0

Angenommen, ich möchte ein WPF-Formular erstellen. In dieser Form gibt es eine Reihe von Titeln und Untertiteln. Theses Titel und Untertitel verwendet das gleiche Steuerelement für die Präsentation. Diese Steuerung ist einfach ein Etikett zwischen einem oberen und einem unteren Separator. Titel müssen beide Trennzeichen haben, Untertitel müssen nur das untere Trennzeichen haben. In diesem Steuerelement gibt es eine boolesche Abhängigkeitseigenschaft. Wenn es auf "True" gesetzt ist, gibt es ein oberes Trennzeichen.Spezifisches Modell für die Ansicht mit MVVM-Muster?

Ist es OK, diese Eigenschaft im Modell für jeden Titel/Untertitel zu binden?

public class MyModelObject : ViewModelBase 
{ 
    private string _labelName; 
    public string LabelName 
    { 
     get 
     { 
     return _labelName; 
     } 
     set 
     { 
      _labelName=value; 
      RaisePropertieChanged(()=>LabelName); 
     } 
    } 

    private bool _topSeparator; 
    public bool TopSeparator 
    { 
     get 
     { 
     return _topSeparator; 
     } 
     set 
     { 
      _topSeparator=value; 
      RaisePropertieChanged(()=>TopSeparator); 
     } 
    } 
} 

Ich mag es nicht viel ... Da ein Modell keine Informationen über die Ansicht haben sollte. Aber gibt es einen sauberen Weg?

Ich dachte über ein bestimmtes Modell für die Ansicht nach ... Aber ich bin mir nicht sicher.

Vielen Dank im Voraus!

---------------- UPDATE -----------------

Nachdem bei IValueConverter sah aus, als Vadim Martynov vorgeschlagen Ich habe einige Leute gesehen, die ihr Model in diese Situationen gebracht haben. Das ist also mein Fazit:

  • Wenn es eine oder zwei bestimmte Eigenschaften Ansicht sind, so stellen Sie ein oder zwei bestimmte IValueConverter
  • Wenn es mehrere Ansicht spezifische Eigenschaften sind, ist es am besten, einen Wrapper zu machen (Have a schau auf diesen Beitrag: Binding Model properties directly in View)

Bin ich richtig?

Antwort

1

Sie sollten IValueConverter verwenden, um Ihre tatsächlichen Daten zu binden, anstatt synthetische Eigenschaften für die Ansicht zu erstellen.

Zum Beispiel können Sie TitleType Aufzählung haben, die Title, Subtitle und Text Elemente enthält.

schreiben dann neuen Konverter:

public class TitleTypeToSeparatorVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var titleType = (TitleType) value; 
     switch(titleType) 
     { 
      case TitleType.Title: 
       // return some value 
      case TitleType.Subtitle: 
       // return some another one value 
      default: 
       // handle this scenario 
     } 
    } 
} 

Read more about IValueConverter

+0

Sehr nützlich! Ich wusste von IValueConverter, aber ich dachte nicht, dass ich sie so benutzen würde. Sind sie der richtige Weg für jedes "View Problem"? Ich meine, du solltest niemals ein "Model for the View" bauen? (Übrigens, es tut mir leid für mein Englisch, wie Sie sehen können, es ist nicht meine Muttersprache: p) – Speuline

+1

@Speuline sollten Sie nie ein "Modell für die Ansicht" bauen. Dann haben Sie Model-Klasse und Sie müssen Ihre Ansicht von den Daten anpassen. Ansichten können plattformspezifische Eigenschaften wie Sichtbarkeit, Farbe, Pinsel und andere enthalten. Sie sollten es nie in ViewModel- oder Model-Klassen verwenden. Dann müssen Sie einen Konverter aus den Daten (Model) in die Ansicht erstellen und Dateneigenschaften mit seinen Konvertern binden. Sie können auch Datenauslöser verwenden. Sie sind auf diesem Weg Ihre Sicht auf Ihr Modell, nicht wahr? –

+1

@Speuline auch kann es eine schlechte Idee sein, Eigentum speziell für die Ansicht zu schaffen, stimme ich zu. Aber Sie haben bereits einen Wert, der den Titel angibt. Sie können es verwenden und Konverter für diese bereits vorhandene Eigenschaft erstellen. –

Verwandte Themen