2016-06-03 5 views
0

Ich habe eine benutzerdefinierte Viewcell erstellt, wo ich Text an ein Label binden und dann in ein Raster einfügen. Wie aber vermeide ich leere Zeilen, wenn der Text, den ich an die Viewcell übergebe, leer ist? Dies ist nur ein Teil des Codes, aber gibt es irgendeine Art von Bindung, die ich vermisse, wenn der Text leer ist?Xamarin Forms Benutzerdefinierte ViewCell, nicht zum Gitter hinzufügen, wenn leer?

public RouteElementsCustomCell() 
{ 
    Label NameLbl = new Label() 
    { 
     TextColor = Color.Black, 
     HorizontalTextAlignment = TextAlignment.Center, 
     FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)) 
    }; 
    NameLbl.SetBinding(Label.TextProperty, "StopName"); 

    Grid grid = new Grid() 
    { 
     Padding = 10, 
     RowDefinitions = 
     { 
      new RowDefinition 
      { 
       Height = GridLength.Auto 
      }, 
     } 
    }; 
    grid.Children.Add(NameLbl,0,1,0,1); 
} 

Antwort

0

In Ordnung, so habe ich dieses Problem mit Hilfe von @irreal gelöst.

Dies führt wahrscheinlich unnötige Komplexität in Ihr Viewmodel ein. Erwägen Sie die Verwendung eines XAML-Wertkonverters, der die Zeichenfolge in Boolean umwandelt. Sie würden dann nur IsVisible binden = "{Binding StopName, Converter = {}}" Es ist sehr nützlich und würde Ihnen erlauben, viele Dinge zu tun, einschließlich der Sichtbarkeit der Kontrolle basierend auf String nicht Null oder leer - @irreal

Die Beschriftung.IsVisibleProperty wurde der Beschriftung hinzugefügt und dann ein IValueConverter verwendet, um zu überprüfen, ob die Zeichenfolge leer, null oder Leerzeichen war.

Label-

Label NameLbl = new Label() 
{ 
    TextColor = Color.Black, 
    HorizontalTextAlignment = TextAlignment.Center, 
    VerticalOptions = LayoutOptions.Start, 
    FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)) 
}; 
NameLbl.SetBinding(Label.TextProperty, "StopName"); 
NameLbl.SetBinding(Label.IsVisibleProperty, "StopName",BindingMode.Default,new StringToBoolConverter(), null); 

Valueconverter

public class StringToBoolConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string valueAsString = value.ToString(); 
     if (string.IsNullOrWhiteSpace(valueAsString)) 
     { 
      return false; 
     } 
     else 
     { 
      return true; 
     } 

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

Dies führt möglicherweise zu unnötiger Komplexität in Ihrem Viewmodel. Erwägen Sie die Verwendung eines XAML-Wertkonverters, der die Zeichenfolge in Boolean umwandelt. Sie würden dann nur IsVisible binden = "{Binding StopName, Converter = {}}" Es ist sehr nützlich und würde Ihnen erlauben, viele Dinge zu tun, einschließlich der Sichtbarkeit der Kontrolle basierend auf String nicht null oder leer . – irreal

-1

Was ich tun würde, ist eine öffentliche Eigenschaft zu meinem Objekt hinzufügen:

public bool ShowItem { get{return !string.IsNullOrEmpty(StopName)};} 

Dann binden die IsVisibleProperty zu showItem

+0

Nicht die richtige Lösung, weil Sie mehrere Boole für Ihr Objekt hinzufügen würden, wenn Sie viele Eigenschaften für ein Objekt haben. Daher ist der richtige Weg, es zu lösen, den iValueConverter zu verwenden, um Codeverdopplung zu vermeiden. –

+0

Ich stimme nicht zu - der eine Bool könnte mehrere Eigenschaften des Objekts überprüfen und ein Ergebnis zurückgeben. – Christine

+0

Es klingt immer noch nach einer schlechten Lösung für mich. Stellen Sie sich vor, dass ich 10 Eigenschaften habe, die ich in einer Listenansicht anzeigen möchte, aber ich möchte nur Eigenschaften anzeigen, die nicht leer sind. Wie werden Sie dies mit 1 Bool Eigentum bestätigen? –

Verwandte Themen