2011-05-12 23 views
5

Saludos,si ItemsControl.ItemsSource es nulo

Tengo un ItemsControl qué plantilla he cambiado para mostrar un RadioButton para cada objeto en el ItemsSource binded.

Sin embargo, el ItemsSource puede estar vacía y cuando está vacío me gustaría mostrar un valor predeterminado. Algo así como "La lista combinada no contiene elementos para que seleccione" ...

Una forma en que pensé es establecer ItemsControl.Visibility en Contraído y tener un TextBlock.Vsibility to Visible que muestra el texto .. Pero esto incluiría muchos más datos.

¿Es posible mostrar un valor por defecto si el ItemsControl.ItemsSource es nulo?

Respuesta

1

Si he entendido bien, creo que se puede resolver el problema mediante la creación de un IValueConverter.

+0

Desde ItemsControl muestra un botón de radio como ItemTemplate, nomather cómo implementar un IValueConverter, no va a cambiar la ItemTemplate (Por lo que yo sé). –

+0

Creé un convertidor que me muestra si mi Lista está vacía o no. Basado en eso, muestro el ItemsControl o un TextBlock que muestra que no hay ningún elemento disponible. –

0

Una cosa que podría hacer es que después de comprobar ItemsControl.ItemsSource es nulo, puede agregar un solo elemento "The binded list contains no items for you to select". Espero que esto sirva a tu propósito.

+0

Desde ItemsControl muestra un botón de radio como ItemTemplate sería una muestra de una casilla con el texto "La lista binded no contiene artículos para que seleccione". Sin embargo, me gustaría que fuera un bloque de texto –

4

Después de crear este sencillo conversor:

public class AnyItemsToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var collection = value as IEnumerable; 
     if (collection == null) 
      return Visibility.Collapsed; 

     return collection.OfType<object>().Any() ? Visibility.Collapsed : Visibility.Visible; 
    } 

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

Puede anular la plantilla de ItemsControl a apo esto utilizando RelativeSource unión.

<UserControl x:Class="SilverlightApplication1.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:SilverlightApplication1"> 
    <UserControl.Resources> 
     <local:AnyItemsToVisibilityConverter x:Key="AnyItemsToVisibilityConverter" /> 
    </UserControl.Resources> 

    <Grid x:Name="LayoutRoot" Background="White"> 
     <ItemsControl> 
      <ItemsControl.Template> 
       <ControlTemplate TargetType="ItemsControl"> 
        <Grid> 
         <TextBlock Text="No Items to Display" 
Visibility="{Binding Items, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource AnyItemsToVisibilityConverter}}" /> 
         <ItemsPresenter /> 
        </Grid> 
       </ControlTemplate>  
      </ItemsControl.Template> 
     </ItemsControl> 
    </Grid> 
</UserControl> 
+0

¡Agradable! Pero cambiaría el nombre 'AnyItemsToVisibilityConverter', o invertiría el valor devuelto - para mí' if any then visible' tiene más sentido. Además, gracias por la plantilla! –

1

No debe crear un convertidor que muestra wether La lista está vacía o no. Es mejor cuando su XAML, convertidor y fuente de datos son elementos totalmente independientes. ¿No es MVVM sobre el acoplamiento flojo?

OK, código subyacente es malo. Gracias por señalar eso. corregí el código fuente, es totalmente estilo declarativo ahora:

 <ControlTemplate x:Key="ListBoxTemplate" TargetType="ListBox"> 
      <StackPanel> 
      <ItemsPresenter 
       Visibility="{Binding Path=NotEmpty, 
       Converter={StaticResource BoolToVisibilityConverter}}"> 
      </ItemsPresenter> 
       <TextBlock Text="No items to select from" 
       Visibility="{Binding Path=Empty, 
       Converter={StaticResource BoolToVisibilityConverter}}"/> 
      </StackPanel> 
     </ControlTemplate> 

     <Style x:Key="ListBoxStyle2" TargetType="ListBox" > 
      <Setter Property="Template" Value="{StaticResource ListBoxTemplate}"> 
      </Setter> 
      <Setter Property="ItemsPanel"> 
       <Setter.Value> 
        <ItemsPanelTemplate> 
         <StackPanel /> 
        </ItemsPanelTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
+0

¿Se da cuenta de que Silverlight es principalmente para su estructura MVVM ... y este código debe usarse solo a menos que sea absolutamente necesario? Por lo tanto, aunque este método puede funcionar. ¡Sigue siendo un mal ejemplo! Además, mal formato y difícil de entender. Votación a la baja –

+0

+1 porque los votos a la baja NO se deben basar en la opinión. MVVM es la forma preferible de trabajar, pero esta sigue siendo una respuesta válida. – Stimul8d

Cuestiones relacionadas