2009-07-28 12 views
1

Ich verwende PRISM (und damit das MVVM-Muster). Ich habe eine komplexe DateTime-Auswahlansicht mit Optionsfeldern. Der Benutzer kann heute, gestern, ein Datum, eine Woche eines Jahres usw. auswählen. Ich benutze Radioknöpfe für die verschiedenen Wahlen.Howto RadioButtons und MVVM Muster

Was ist der beste Weg, das in MVVM zu tun? Ich kann mir wirklich keinen sauberen Weg vorstellen. Ich könnte viele benutzerdefinierte Verhaltensweisen erstellen, die zu jedem Element hinzugefügt werden, um sie zu verfolgen, aber es scheint nicht wartbar zu sein.

Ich werde einige Code-Behind setzen, aber ich wirklich don; t so und für mich bricht es das MVVM-Prinzip (alles in den XAML).

Hat jemand eine bessere Idee, wie man das macht?

Antwort

0

Wie wärs mit einem ComboBox anstelle des RadioButton s eine Liste der TimeOffset (benutzerdefinierte Klasse), gebunden an Ihr Ansichtsmodell, mit einem entsprechenden SelectedTimeOffest Eigentum darstellen.
Wenn Sie abhängig vom Typ TimeOffset zusätzliche Informationen anzeigen müssen, z. a WeekOffset (Unterklasse TimeOfset) mit einer WeekCount Eigenschaft, haben eine Inhaltskontrolle mit mehreren DataTemplate s durch den Typ von TimeOFfset angepasst.

Nur eine Idee ...

0

Das Ansichtsmodell wurde entwickelt, um das Modell in einer Art und Weise präsentieren kann die Ansicht verbrauchen.

In diesem Fall könnten Sie eine boolesche Eigenschaft für jede Schaltfläche in der VM haben, und wenn eine Schaltfläche aktualisiert wird, werden nur alle anderen Eigenschaften auf false gesetzt. Dann können Sie in Ihrer Ansicht die einzelnen Eigenschaften IsChecked an die entsprechende Eigenschaft im ViewModel binden.

Beachten Sie auch, dass es derzeit eine bug gibt, die Radiobuttons in WPF bindet. Here's eine mögliche Lösung.

+0

Wow arbeiten, habe ich geschrieben, dass Fehler vor Ewigkeiten und ich merkte nicht, dass es so viel Aufmerksamkeit bekam;) Beachten Sie, dass es in .NET 4 behoben wurde. –

+0

@JC Sie sind also verantwortlich! : P –

2

Behalten Sie die RadioButtons bei, fügen Sie Ihrer VM einen Aufzählungstyp hinzu, der Dinge wie "Heute", "Gestern" oder "Morgen" zurückgeben kann. Auf der UI-Seite erstellen Sie einen ValueConverter, der einen Parameter wie "Tomorrow" verwendet und vergleicht ihn mit dem gebundenen Wert auf VM, dann gibt das Bool zurück? benötigt von IsChecked.

1

Legen Sie es in Code hinter.

Das M-V-VM-Muster ist nicht "alles in XAML setzen" es ist "getrennte Anliegen". Ihre VM möchte ein DateTime-Recht? In diesem Fall ist es egal, wie diese DateTime ausgewählt wird, sie benötigt nur eine DateTime.

Die View-Logik in das ViewModel zu stellen, ist keine gute Idee, da Sie jetzt der VM Wissen über die Funktionsweise der View geben. Der Flow soll View sein, der über das ViewModel weiß, welches das Model kennt. Das Umgekehrte ist normalerweise nicht wahr. (Wie bei allen Computer bezogen gibt es immer Ausnahmen)

Hoffe das hilft.