2017-03-27 3 views
0

Ich habe eine Listview (die an eine ObservableCollection gebunden ist), alle Elemente aktivieren/deaktivieren Berechnung basierend auf einem IValueConverter.Xamarin: Wie IValueConverter bei einem Benachrichtigungsaufruf aufgerufen wird

Unten ist der Code für IValueConverter ...

public class StateCheckConverter: IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var result = false; 

      if (value != null) 
      { 
       var element = value as Element; 
       if (element.Status != Status.Pending) 
        result = true; 
      } 

      return result; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return value; 
     } 
    } 

Jetzt habe ich bekam eine Benachrichtigung (von Message) und auf dem Rückruf Zustand eines des Elements geändert hat. Der Text und die Werte des Elements können geändert werden (z. B. Label, Bild mit INotifyPropertyChanged). Aber wie rufe ich den entsprechenden IValueConverter auf und aktualisiere die ObservableCollection?

Danke.

UPDATE:

<ContentPage.Resources> 
    <ResourceDictionary> 
     <vm:StateCheckConverter x:Key="transmissionStateCheck" /> 
    </ResourceDictionary> 
    </ContentPage.Resources> 

<Label x:Name="lblLocked" 
         IsVisible="{Binding ., Converter={StaticResource transmissionStateCheck}, Mode=TwoWay}" 
         HorizontalTextAlignment="Center" 
         BackgroundColor="Gray" 
         Opacity="0.75" 
         Text="LOCKED" 
         TextColor="White" 
         FontSize="35" 
         /> 
+0

Wie verwenden Sie den Konverter? Bitte geben Sie den Code an, an den Sie den Zustand "IsEnabled" der Elemente binden. – Emad

+0

@Emad Ich habe den Code aktualisiert .. – Xander

Antwort

1

Ok ein Weg ist, Sie Bindungseigenschaft zu ändern und binden an die Status selbst:

<Label x:Name="lblLocked" 
     IsVisible="{Binding Status, Converter={StaticResource transmissionStateCheck}}" 
     HorizontalTextAlignment="Center" 
     BackgroundColor="Gray" 
     Opacity="0.75" 
     Text="LOCKED" 
     TextColor="White" 
     FontSize="35"/> 

Natürlich werden Sie dann zu ändern Ihr Wertwandler auch:

public class StateCheckConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var result = false; 

     if (value is Status status) 
     { 
      if (status != Status.Pending) 
       result = true; 
     } 

     return result; 
    } 

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

Ich hoffe es hilft :)

Auch ich habe ein paar Dinge in Ihrem Code geändert. Sie können IsVisible nicht mit dem Zwei-Wege-Modus binden, so dass es automatisch in eine Richtung geht.

Auch zurück konvertieren sollte bool nehmen und Status zurückgeben, die unmöglich und unnötig ist, also entfernte ich es.

+1

Funktioniert perfekt, +1 für die Art, wie Sie gegraben haben :) – Xander

Verwandte Themen