example databinding bindingcontext c# silverlight xaml binding itemssource

bindingcontext - combobox databinding c#



Mostrar si ItemsControl.ItemsSource es nulo (4)

Saludos,

Tengo un ItemsControl cuya plantilla he cambiado para mostrar un RadioButton para cada objeto en el ItemsSource enlazado.

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

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

¿Es posible mostrar un valor predeterminado si ItemsControl.ItemsSource es nulo?


Después de crear este simple convertidor:

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 ItemsControl para apoyar esto usando 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>


No debe crear un convertidor que muestre si su 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, el código detrás es malo. Gracias por señalar eso. Corregí el código fuente, ahora es un estilo totalmente declarativo:

<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>


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


Si entendí correctamente, creo que puedes resolver tu problema creando un IValueConverter .