eine Ansicht Modell SomeViewModel
von SomeView
verwendet Stellen Sie sich vor:Wie ViewModel zu machen - View-Oberfläche klarer?
public class SomeViewModel : BindableBase
{
public NumberEditorViewModel VoltageEditor { get; private set; }
public SomeViewModel()
{
VoltageEditor = new NumberEditorViewModel(...) { ... }
}
}
, die für die Bearbeitung aller Zahlen eine wieder verwendbare Unteransicht Modell verwendet, so etwas wie:
public class NumberEditorViewModel: BindableBase
{
public string Title { get; private set; }
public string Value { get; set; }
public string Unit { get; private set; }
...
}
So ist der Ansicht, es wie folgt verwendet werden:
<StackPanel Orientation="Horizontal">
<TextBlock Text={Binding VoltageEditor.Title} />
<TextBox Text={Binding VoltageEditor.Value} />
<TextBlock Text={Binding VoltageEditor.Unit} />
</StackPanel>
Diese Eigenschaften - Title
, Value
, Unit
sind, worauf die Ansicht zugreifen wird.
in Wirklichkeit aber die NumberEditorViewModel
ist eine komplizierte Klasse, bietet Einheitenumrechnung (metrisch/imperial), Formate Werte, so dass sie die richtige Präzision (Formatstrings) etc. Aus diesem Grund haben sie eine ganze Reihe von Eigenschaften angeben, welche Einheit es verwendet, welche Art von Genauigkeit erforderlich ist etc., so kann es den Wert richtig formatieren und analysieren. Sie würden in SomeViewModel
eingestellt werden, wie:
VoltageEditor = new NumberEditorViewModel()
{
Title = "My Voltage:",
UnitType = UnitType.Voltage,
PrecisionType = PrecisionType.SomePrecision,
...
}
Dieses NumberEditorViewModel
Modell unordentlich macht, weil es eine Menge von Eigenschaften hat, und niemand weiß, wer von ihnen sind von der Ansicht verwendet werden soll, und welche durch verwendet werden der Ersteller dieses Objekts, um sein Verhalten zu steuern.
Wie kann ich dies verbessern, um eine klarere Schnittstelle zwischen der Ansicht und dem Ansichtsmodell zu schaffen, und auch zwischen diesem Ansichtsmodell und seinem Ersteller?
Ich habe versucht, eine Schnittstelle zu verwenden, um der Ansicht nur eine Teilmenge von Eigenschaften zu geben, aber WPF scheint dies zu ignorieren und verwendet alles, was auf dem Objekt für die Bindung verfügbar ist. Und dies tötet auch den ersten Ansatz des Betrachtungsmodells.
Sie könnten View-Modell ein anderes Objekt wie 'NumberViewModelConfig' übergeben, aber es ist schwer, dies als ein Problem zu sehen ... Wen kümmert es, dass die Ansicht wissen muss, an welche Eigenschaften zu binden? Es ist unvermeidlich, da jede Bindung eine Eigenschaft spezifizieren muss, so dass eine Schnittstelle oder irgendetwas anderes nur für mehr Arbeit nicht viel Gewinn scheint. Vielleicht ist nur eine gute Dokumentation die Antwort hier. – blins
Übergeben Sie Eigenschaften, die das Verhalten im Konstruktor steuern? – Evk
@Evk das ist, was ich jetzt mache, aber der Konstruktor bekommt ~ 10 Parameter an diesem Punkt und es wächst - es wird unordentlich. Ganz zu schweigen davon, dass Sie sie später nicht ändern können. – Arek