2011-05-12 6 views
5

Saluti,Visualizza se ItemsControl.ItemsSource è nullo

Ho un ItemsControl quale modello ho cambiato per mostrare un RadioButton per ogni oggetto nel ItemsSource rilegata.

Tuttavia ItemsSource può essere vuoto e quando è vuoto mi piacerebbe mostrare un valore predefinito. Qualcosa come "La lista rilegata non contiene elementi da selezionare" ...

Un modo in cui ho pensato è impostare ItemsControl.Visibility su Collapsed e avere TextBlock.Visibility to Visible che mostra il testo .. Ma questo includerebbe molti più dati.

È possibile mostrare un valore predefinito se ItemsControl.ItemsSource è null?

risposta

1

Se ho capito correttamente, penso che sia possibile risolvere il problema creando IValueConverter.

+0

Poiché ItemsControl mostra un radiobutton come ItemTemplate, in base a come implemento un IValueConverter, non cambierà il ItemTemplate (per quanto ne so). –

+0

Creato un convertitore che mi mostra se la mia lista è vuota o meno. In base a ciò, mostro o il comando ItemsControl o TextBlock che mostra che non c'è nessun articolo disponibile! –

0

Una cosa che si potrebbe fare è che dopo aver controllato ItemsControl.ItemsSource è nullo, è possibile aggiungere un singolo articolo "The binded list contains no items for you to select". Spero che questo serva al tuo scopo.

+0

Dal momento che l'ItemsControl mostra un radiobutton come ItemTemplate sarebbe mostrare un Radiobutton con il testo "La lista binded non contiene elementi per la selezione". Tuttavia desidero che sia un blocco di testo –

4

Dopo aver creato questo semplice convertitore:

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(); 
    } 
} 

È possibile ignorare il modello ItemsControl a suppor questo utilizzando RelativeSource Binding.

<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

Bello! Ma rinominerei "AnyItemsToVisibilityConverter', o invertirò il valore restituito - a me" se c'è ne poi visibile "ha più senso. Inoltre, grazie per il modello! –

1

Non è consigliabile creare un convertitore che mostri che l'elenco è vuoto o meno. È meglio quando il tuo XAML, il convertitore e l'origine dati sono elementi totalmente indipendenti. MVVM non parla di accoppiamento lento?

OK, il codice dietro è malvagio. Grazie per la segnalazione. ho corretto il codice sorgente, è totalmente stile dichiarativo ora:

 <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

Ti rendi conto che Silverlight è principalmente per la sua struttura MVVM .. e questo codice dovrebbe essere usato solo se assolutamente necessario? Quindi sebbene questo metodo possa funzionare. È ancora un cattivo esempio! Inoltre, formattazione errata e difficilmente comprensibile. Downvoting –

+0

+1 perché i downvotes NON devono essere basati sull'opinione. MVVM è il modo di lavorare preferibile, ma questa era ancora una risposta valida. – Stimul8d