2010-01-23 8 views

Respuesta

40

Se puede usar un ValueConverter:

<TextBlock 
    Visibility="{Binding InstanceName, Converter={local:StringNullOrEmptyToVisibilityConverter}}" 
    Text="{Binding InstanceName}"/> 

con el siguiente código subyacente:

public class StringNullOrEmptyToVisibilityConverter : System.Windows.Markup.MarkupExtension, IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return string.IsNullOrEmpty(value as string) 
      ? Visibility.Collapsed : Visibility.Visible; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    {    
     return this; 
    } 
} 
+0

Puedo ver que funciona, pero eso se volverá realmente tedioso rápidamente. No puedo evitar pensar que debe haber una mejor manera. –

+6

¿cuál crees que sería la parte tediosa? ¿Crees que configurar la visibilidad y el texto por separado podría ser tedioso? o lo piensas así de valueconverters en general? ¡Una cosa que cambiaría es vincular la propiedad de visibilidad con el origen de la familia a self con path = Name para que no repita "InstanceName"! aparte de eso no veo cómo esto podría volverse tedioso (siempre se podría escribir su propio MarkupExtensions o incluso un Comportamiento que podría hacer esto, pero yo pensaría que es exagerado y un valueconverter sería solo el cosa correcta) –

0

Al poner una propiedad adicional en su modelo de vista que se puede unir el atributo de visibilidad a:

public class ViewModel 
{ 
    public string InstanceName {...} 
    public string Visibility InstanceVisibility 
    { 
     get 
     { 
      return String.IsNullOrEmpty(InstanceName) ? Visibility.Collapsed : Visibility.Visible; 
     } 
} 
+1

No me gusta eso. El modelo debe ser compartido por varias vistas, pero el comportamiento solo es necesario para este. –

+1

Imo existe una relación uno-a-uno entre las vistas y los modelos de vista. Si tiene vistas que comparten alguna funcionalidad común, podría extraer las piezas comunes y quizás ponerlas en una superclase común de viewmodel. –

+0

Eso no suena bien. No estoy familiarizado con 'ViewModels', pero con las vistas múltiples MVC clásicas puede enlazar a la misma instancia de un modelo. De esa manera, puede editar en una ventana y verla actualizada en tiempo real en otra. –

3

Si está dentro de una plantilla (Data-) que puede utilizar disparadores para eso.

De lo contrario, el MVVM-Patrón o una ValueConverter le ayudará.

+0

+1 El convertidor de valores es más correcto. –

+0

Ambos activadores y ValueConverter son menos comprobables. –

+2

Ninguno de ellos es "comprobable", ya que la única prueba real es inspeccionar visualmente los resultados para el efecto deseado. –

0
<TextBlock Text="{Binding Path=InstanceName},FallbackValue={x:Null}"></TextBlock> 

A continuación, agregue un DataTrigger para comprobar que el valor sea nulo y cambie la visibilidad con Setter. Este es el método simple que usa iam.

+0

Interesante. Pero esto no funcionará con InstanceName == String.Empty ... –

0

Ok, así que esto es cercano con PyBinding:

<TextBlock Text="{Binding Path=InstanceName}" Visibility="{p:PyBinding BooleanToVisibility(IsNotNull($[.InstanceName]))}" ></TextBlock> 

tengo que sustituir IsNotNull con algo que significa IsNotNullOrEmpty, pero me estoy acercando.

Cuestiones relacionadas