Enlace de visibilidad de Silverlight ListboxItem

Estoy haciendo un prototipo de una aplicación Silverlight en Expression Blend 4 y estoy tratando de mostrar / ocultar elementos ListBox / ComboBox basados ​​en valores booleanos en los datos a los que están vinculados. Encontré un ejemplo en línea que sugirió que esto funcionaría, pero no es así:

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing"
    xmlns:local="clr-namespace:PrototypeScreens"
    mc:Ignorable="d"
    x:Class="PrototypeScreens.Toolbar"
    Width="640" Height="31">
    <UserControl.Resources>
        <local:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="White">
        <ComboBox HorizontalAlignment="Right" Style="{StaticResource ComboBox-Sketch}" VerticalAlignment="Top" Width="32" ItemsSource="{Binding Sites}" >
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                    <ed:RegularPolygon Fill="{StaticResource BaseBackground-Sketch}" ed:GeometryEffect.GeometryEffect="Sketch" HorizontalAlignment="Left" Height="10" InnerRadius="0.47211" Margin="0,0,0,0" PointCount="5" Stretch="Fill" Stroke="{StaticResource BaseBorder-Sketch}" StrokeThickness="2" UseLayoutRounding="False" Width="10"
                        Visibility="{Binding IsFavorite, Converter={StaticResource BooleanToVisibilityConverter}}" />                   
                    <TextBlock Style="{StaticResource BasicTextBlock-Sketch}" Text="{Binding Name}" HorizontalAlignment="Left" Margin="15,0,0,0" />                     
                    </Grid>
                </DataTemplate>
            </ComboBox.ItemTemplate>
            <!--
            <ComboBox.ItemContainerStyle>
                <Style TargetType="ComboBoxItem">
                    <Setter Property="Visibility" Value="{Binding IsRegistered, Converter={StaticResource BooleanToVisibilityConverter}}" />
                </Style>
            </ComboBox.ItemContainerStyle>
            -->
        </ComboBox>
        <ListBox Height="29" Margin="0,0,32,0" Style="{StaticResource ListBox-Sketch}" VerticalAlignment="Top" ItemsSource="{Binding Sites}" ScrollViewer.HorizontalScrollBarVisibility="Hidden">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" FlowDirection="RightToLeft" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                    <TextBlock Style="{StaticResource BasicTextBlock-Sketch}" Text="{Binding Id}" HorizontalAlignment="Left" Margin="0,0,0,0" />                        
                    <ed:RegularPolygon Fill="{StaticResource BaseBackground-Sketch}" ed:GeometryEffect.GeometryEffect="Sketch" HorizontalAlignment="Left" Height="10" InnerRadius="0.47211" Margin="20,0,0,0" PointCount="5" Stretch="Fill" Stroke="{StaticResource BaseBorder-Sketch}" StrokeThickness="2" UseLayoutRounding="False" Width="10"/>                  
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <!--
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Visibility" Value="{Binding IsFavorite, Converter={StaticResource BooleanToVisibilityConverter}}" />
                </Style>
            </ListBox.ItemContainerStyle>
            -->
        </ListBox>
    </Grid>
</UserControl>

Cuando intento cargar la pantalla con este control de usuario, la aplicación se bloquea a menos que comente los estilos del contenedor (como en el código anterior). ¿Qué estoy haciendo mal?

NOTA: La visibilidad del polígono dentro del ComboBoxItem funciona bien.

ACTUALIZACIÓN Incluí el xaml para todo el control de usuario.

ACTUALIZACIÓN Recibí algunos detalles de error:

Webpage error details

User Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MDDC; .NET4.0C; .NET4.0E; BRI/2)
Timestamp: Tue, 10 May 2011 15:21:02 UTC


Message: Unhandled Error in Silverlight Application Exception has been thrown by the target of an invocation.   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at System.Reflection.Assembly.CreateInstance(String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at Microsoft.Expression.Prototyping.Workspace.PlayerWindow.InstantiateScreen(String screen, Boolean showImmediately)
   at Microsoft.Expression.Prototyping.Workspace.PlayerWindow.TransitionScreens(String from, String to)
   at Microsoft.Expression.Prototyping.Navigation.NavigationViewModel.NavigateToScreen(String name, Boolean record)
Line: 1
Char: 1
Code: 0
URI: file:///D:/Projects/Expression/Prototype/Bin/Debug/Default.html

ACTUALIZACIÓN: Creo que hice algunos progresos. Parece que el enlace no se puede resolver. ListBox y ComboBox tienen ambos ItemsSource="{Binding Sites}" y Sites es de tipo System.Collections.ObjectModel.ObservableCollection<SitesItem>. SiteItem tiene propiedades IsRegistered y IsFavorite.

Así que supongo que la pregunta es: ¿es posible enlazar para enlazar IsRegistered y IsFavorite en un parche de ItemContainerStyle?

preguntado el 10 de mayo de 11 a las 13:05

¿Dónde configura el recurso estático para su BooleanToVisibilityConverter? Podría ser que no se crea antes de aplicar el estilo. ¿Puede proporcionar detalles del accidente? -

Tengo el BooleanToVisibilityConverter definido. -

Sin embargo, puede ser un problema de orden. Si el convertidor no se crea cuando se aplica el estilo, es posible que tenga un problema. Valdría la pena ver si puede averiguar en qué orden se hacen las cosas. -

Intente abrir el mismo proyecto en VS, adjuntando el depurador a blend. Luego ponga un punto de freno en BooleanToVisibilityConverter y vea si se golpea. -

1 Respuestas

WPF ya viene con un BooleanToVisibilityConverter listo para usar. Así que simplemente defínalo de la siguiente manera:

<UserControl.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</UserControl.Resources>

Espero que esto ayude

Respondido el 28 de junio de 11 a las 18:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.