2009-08-05 1 views
0

Wie ist das typische Muster zum Anzeigen eines "nicht verfügbaren" Werts beim Datenbinding in WPF?Muster für den Wert "unavailable" bei der Datenbindung in WPF

Zum Beispiel verwende ich MVVM und TextBlock s aus meiner Sicht sind an meine Viewmodel Eigenschaften gebunden, von denen einige int s sind. Manchmal möchte ich in meiner Ansicht zwei Bindestriche ("-") anzeigen und nicht den Eigenschaftswert.

Ich könnte die Eigenschaft zu einer Zeichenfolge ändern, und dann im Getter fügen Sie eine Logik hinzu, um anzugeben, ob es den Wert oder "-" zurückgibt. Dies ist wahrscheinlich der geeignete Weg, um MVVM zu verwenden, aber gibt es irgendwelche einfacheren Möglichkeiten?

Gibt es eine Möglichkeit, die TextBlock 's FallbackValue zu nutzen? Oder gibt es einen anderen Ansatz, um die Datenbindung vorübergehend zu unterbrechen und einen "nicht verfügbaren" Wert anzuzeigen?

Antwort

3

FallbackValue wird nur verwendet, wenn der Bindungspfad nicht aufgelöst werden kann oder der Konverter DependencyProperty.UnsetValue zurückgibt. Konverter werden im Allgemeinen gemieden, wenn MVVM ausgeführt wird. Mein Vorschlag wäre, zwei Eigenschaften, eine, die den int Wert enthält und einer, der den Anzeigewert enthält:

public int SomeValue 
{ 
    get { return _someValue; } 
    set 
    { 
     if (_someValue != value) 
     { 
      _someValue = value; 
      OnPropertyChanged("SomeValue"); 
      OnPropertyChanged("SomeValueDisplay"); 
     } 
    } 
} 

public string SomeValueDisplay 
{ 
    get { return _someValue == -1 ? "--" : _someValue.ToString(); } 
} 

Dies Sie das Beste aus beiden Welten. Ihre VM-Logik arbeitet mit der int Eigenschaft, aber Ihre TextBlock bindet direkt an eine string Darstellung der zugrunde liegenden int.

+0

'SomeValueDisplay' sollte eine Zeichenkette sein, nicht int –

+0

Danke für Ihre Antwort. In meinem Fall würde ich die zweite Eigenschaft nicht wirklich brauchen - ich kann meine Eigenschaft direkt in eine Zeichenkette ändern. –

+0

@Thomas: danke - bearbeitet. –

0

Da ein TextBlock bereits Text anzeigt, warum nicht nur einen benutzerdefinierte Add IMultiValueConverter auf die Bindung, die "--" im Fall kehrt von, sagen sie, etwas bool Wertes auf der VM?

0

WPF verwendet bereits Konverter hinter den Kulissen (z. B. int in string), um Ihre Werte in den Textblöcken anzuzeigen. Wenn Sie die Funktionalität ändern möchten, können Sie einen einfachen benutzerdefinierten Konverter für jeden denkbaren Sonderfall bereitstellen.

0

könnten Sie ein Nullable-int für die Eigenschaft verwenden, und in der Bindung TargetNullValue angeben = -.

Wenn Sie den ursprünglichen Wert trotzdem benötigen, können Sie Ihren tatsächlichen int-Wert als Hintergrundspeicher verwenden und Logik verwenden, um zu bestimmen, ob der Wert oder null zurückgegeben werden soll.