2011-04-09 11 views
7

Me gustaría implementar un comportamiento "NullText" para un TextBlock que está vinculado a una propiedad en un ViewModel. Cuando esa propiedad en ViewModel es nula o está vacía, me gustaría mostrar el texto en cursiva gris algo así como "Sin datos". Me gustaría que esto siga el patrón MVVM pero estoy perdido ...¿Cómo implementar NullText en un TextBlock con enlace?

actualización Así que después de jugar un rato con la solución James Webster sugirió, lo tengo que trabajar así ...

<UserControl.Resources> 
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> 
    <c:NullOrEmptyValueConverter x:Key="NullOrEmptyValueConverter" Text="(No Data)"/> 
</UserControl.Resources> 

...  

<TextBlock Name="SerialNumberTextBlock" Text="{Binding Path=SerialNumber, Converter={StaticResource NullOrEmptyValueConverter}}"> 
    <TextBlock.Resources> 
     <Style TargetType="TextBlock"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=SerialNumberTextBlock, Path=Text}" Value="(No Data)"> 
        <Setter Property="FontStyle" Value="Italic"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Resources> 
</TextBlock> 
+0

¿Cuál es su punto de vista y la vista del modelo de código existente? – BoltClock

+0

En realidad, ViewModel es una ObservableCollection de un objeto que es observable en sí mismo. Esta colección está vinculada a ItemsControl. Luego, en ItemsControl.Template, tengo un TextBlock vinculado a una propiedad del elemento en la colección. Si esa propiedad está vacía o nula, quiero que aparezca "Sin datos" en ItemsControl en la Vista. – Jim

Respuesta

4

Recomiendo implementar un IValueConverter; si el valor fuente no es nulo o está vacío, páselo a TextBlock. Si el valor de origen es nulo o está vacío, represente el texto elegido.

public class NullValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string str = (string)value; 
     if (str.IsNullOrWhitespace()) 
     { 
      return "No Data"; 
     } 
     return str; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     ... //An empty implementation I expect... 
    } 
} 

Sin embargo solo me he dado cuenta que desea establecer el estilo, así ... hmmm, probablemente un DataTrigger que establece el estilo si el valor es 'No hay datos' requerida espero;

<TextBlock Text="{Binding Path=SomeProperty, Converter={StaticResource keyToNullValueConverter}"> 
    <TextBlock.Triggers> 
     <DataTrigger Binding="{Binding Path=Text}" Value="No Data"> 
      <Setter Property="FontStyle" Value="Italic"/> 
     </DataTrigger> 
    </TextBlock.Triggers> 
</TextBlock> 

Algo en ese sentido podría funcionar.

+0

+1, pero debe corregir esto: 'string str = (DateTime) value;';) –

+0

Me gusta esta idea. ¡Tendré que darle una oportunidad! – Jim

+0

@Thomas; gracias, arreglado. –

0

Usted podría tratar de obligar a una propiedad que se ve por lo tanto

private string _textBlockText; 
    public string TextBlockText 
    { 
     get 
     { 
      if(string.IsNullOrEmpty(_textBlockText)) 
      { 
       return "No Data"; 
      } 
      return _textBlockText; 
     } 
     set 
     { 
      _textBlockText = value; 
     } 
    } 

y luego utilizar el XAML que James ha mencionado para el peinado. Ahorra la necesidad de un convertidor.

+0

Creo que esto funcionaría en una sola instancia, pero cuando hay varios TextBlocks y valores para aplicar el mismo texto Null, piensa que el enfoque del convertidor es mejor. ¡Gracias de todos modos! – Jim

2

Creo que no necesita crear una clase de conversión, simplemente puede escribir su código de estilo de esta manera.

<Style TargetType="TextBlock">    
<Style.Triggers>     
<DataTrigger Binding="{Binding ElementName=SerialNumberTextBlock, Path=Text}" Value="{x:Null}">      
<Setter Property="FontStyle" Value="Italic"/> 
</DataTrigger> 
<DataTrigger Binding="{Binding ElementName=SerialNumberTextBlock, Path=Text}" Value="{x:Static System:String.Empty}">      
<Setter Property="FontStyle" Value="Italic"/> 
</DataTrigger> 
</Style.Triggers>   
</Style> 

Nota: - Es necesario incluir el espacio de nombres del sistema como

xmlns:System="clr-namespace:System;assembly=mscorlib" 
+0

¿Qué harías para establecer un texto alternativo, p. "Sin datos" ? – Jim

+0

Agregue otro setter en cada DatatTrigger para establecer el texto requerido. – pchajer

Cuestiones relacionadas