Привязка видимости Silverlight ListboxItem - PullRequest
1 голос
/ 10 мая 2011

Я делаю прототип приложения Silverlight в Expression Blend 4 и пытаюсь показать / скрыть элементы ListBox / ComboBox на основе логических значений в данных, с которыми они связаны. В Интернете я нашел пример, который предположил, что это будет работать, но это не так:

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

Когда я пытаюсь загрузить экран с этим пользовательским элементом управления, приложение вылетает, если я не закомментирую стили контейнера (как в приведенном выше коде). Что я делаю не так?

ПРИМЕЧАНИЕ: Видимость многоугольника внутри ComboBoxItem работает отлично.

ОБНОВЛЕНИЕ Я включил xaml для всего пользовательского контроля

ОБНОВЛЕНИЕ Я получил некоторые детали ошибки:

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

ОБНОВЛЕНИЕ: Я думаю, что добился определенного прогресса. Похоже, привязка не может быть решена. ListBox и ComboBox имеют ItemsSource="{Binding Sites}" и Sites типа System.Collections.ObjectModel.ObservableCollection<SitesItem>. SiteItem имеет свойства IsRegistered и IsFavorite.

Итак, я предполагаю, что вопрос заключается в следующем: возможно ли связать привязку к IsRegistered и IsFavorite в ItemContainerStyle?

1 Ответ

0 голосов
/ 28 июня 2011

WPF уже поставляется с BooleanToVisibilityConverter из коробки. Так что просто определите это следующим образом:

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

Надеюсь, это поможет

...