2011-05-10 6 views
1

Je crée un prototype d'application Silverlight dans Expression Blend 4 et j'essaie d'afficher/masquer les éléments ListBox/ComboBox en fonction des valeurs booléennes dans les données auxquelles ils sont liés. J'ai trouvé un exemple en ligne qui a suggéré cela fonctionnerait, mais il ne possède pas:Silverlight ListboxItem Visibility binding

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

Lorsque je tente de charger l'écran avec ce contrôle utilisateur, les application se bloque à moins que je commente les styles de conteneurs (comme dans le code ci-dessus). Qu'est-ce que je fais mal?

REMARQUE: La visibilité du polygone dans ComboBoxItem fonctionne correctement.

MISE À JOUR I inclus le XAML pour l'ensemble usercontrol

MISE À JOUR Je suis arrivé quelques détails d'erreur:

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 

MISE À JOUR: Je pense avoir fait des progrès. Il semble que la liaison ne peut pas être résolue. Le ListBox et ComboBox ont tous deux ItemsSource="{Binding Sites}" et Sites est de type System.Collections.ObjectModel.ObservableCollection<SitesItem>. SiteItem a les propriétés IsRegistered et IsFavorite.

Donc je suppose que la question est: Est-il possible de lier à lier à IsRegistered et IsFavorite dans un ?

+1

Où avez-vous mis la ressource statique pour votre 'BooleanToVisibilityConverter'? Peut-être que ce n'est pas créé avant l'application du style. Pouvez-vous fournir des détails sur l'accident? –

+0

J'ai le 'BooleanToVisibilityConverter' défini. –

+0

Il peut s'agir d'un problème de commande. Si le convertisseur n'est pas créé lorsque le style est appliqué, vous pouvez avoir un problème. Cela pourrait valoir la peine de voir si vous pouvez déterminer dans quel ordre les choses sont faites. –

Répondre

0

WPF est déjà livré avec un BooleanToVisibilityConverter prêt à l'emploi. Donc, il suffit de définir comme suit:

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

Hope this helps