2016-06-27 6 views
1

So habe ich eine ProgressRing und eine TextBlock und ich versuche, diesen grundlegenden Hack zu implementieren, der beide Elemente anzeigen soll, wenn TextBlock Text einen Wert zugewiesen bekommt (alles andere als Null), Andernfalls sollten beide Elemente ausgeblendet werden, wenn TextBlocks Text null ist.Wie man einen Konverter von Zeichenkette zu Sichtbarkeit implementiert

Mein Xaml sieht wie folgt aus. TextBlocks Text ist an MessageForProgressRing gebunden und seine Sichtbarkeit ist sowohl an MessageForProgressRing als auch an TargetNullValue gebunden. Das gleiche gilt für mich ProgressRing:

<StackPanel Panel.ZIndex="100" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"> 
     <mahControls:ProgressRing Height="50" IsActive="True" Width="50" Visibility="{Binding MessageForProgressRing, TargetNullValue=Collapsed, FallbackValue=Visible}" Foreground="White" Margin="0,0,0.2,0" /> 
     <TextBlock Text="{Binding MessageForProgressRing}" Visibility="{Binding MessageForProgressRing, TargetNullValue=Collapsed, FallbackValue=Visible}"/> 
    </StackPanel> 

in Code Dann hinter ich die Eigenschaft, nur auslösen und es Wert auf einige Schaltfläche Ereignishandler zuweisen:

private void closeApplicationButtonTask() 
{ 
    ((CaptureViewModel)DataContext).MessageForProgressRing = "Closing... "; 
    Application.Current.MainWindow.Close(); 
} 

Doch meiner ViewModelBase (Eltern aller Meine Ansicht Modelle) es erscheint ein Fehler auf OnPropertyChanged Sprich:

Angeforderter Wert 'Closing ...' wurde nicht gefunden.

Ich glaube, ich brauche einen Konverter, weil Sichtbarkeit-Closing... rechts binded ist? Wenn ja, wie kann ich es erreichen?

P.S Ich konnte es nicht in OnPropertyChanged tun, weil ich die value nicht sehe, um es zuzuweisen. Ich denke auch nicht, dass es eine gute Idee ist, da es vor, während und nach der Ausführung große Zeit genannt wird.

+0

Haben Sie irgendwelche Nachforschungen dazu gemacht? Eine einfache Google-Suche nach "wpf IValueConverter" würde Ihnen viele Beispiele und Tutorials wie [dieses] (http://wpftutorial.net/ValueConverters.html) bringen. –

+0

@Charles Ja, aber ich weiß, was ist das Schlüsselwort (IValueConverter?). Danke, ich sehe es an –

+0

Meine Suche war wahrscheinlich zu spezifisch, das Tutorial, mit dem ich verlinkt habe, ist der erste Treffer für 'wpf converter'. Du kannst mir vielleicht verzeihen, dass du denkst, du hättest dich nicht damit befasst! –

Antwort

3

Normalerweise bevorzuge ich dieses Problem zu lösen, indem ich eine boolesche Eigenschaft in meinem Ansichtsmodell (z. B. HasMessageForProgressRing oder IsProgressRingVisible). Es ist normalerweise eine allgemeinere Lösung. Dann können Sie eine BooleanToVisibilityConverter verwenden. Wenn Sie wirklich einen Konverter implementieren möchten, erstellen Sie einfach eine Klasse, die IValueConverter implementiert. Die Convert Implementierung von diesem sollte ein Stück Kuchen für Ihren einfachen Anwendungsfall sein. ConvertBack ist in den meisten Fällen nicht notwendig (und wird nicht in Ihrem sein). Es würde ungefähr so ​​aussehen:

public class NullToCollapsed : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value != null ? Visibility.Visible : Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Kühl. Ich mache das))) –

Verwandte Themen