【问题标题】:LongListSelector empty styleLongListSelector 空样式
【发布时间】:2014-10-23 13:08:04
【问题描述】:

我想在 LongListSelector 没有项目时显示TextBlock。我可以对我的应用程序中的每个列表执行此操作,但这并不明智。所以我正在尝试编辑列表样式并将其应用于每个列表。

如何在其样式中绑定 LongListSelector ItemsSouce 计数?

这就是我现在的位置。

<Style TargetType="phone:LongListSelector">
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="phone:LongListSelector">
                <Grid Background="{TemplateBinding Background}">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="ScrollStates">
                            <VisualStateGroup.Transitions>
                                <VisualTransition GeneratedDuration="00:00:00.5" />
                            </VisualStateGroup.Transitions>
                            <VisualState x:Name="Scrolling">
                                <Storyboard>
                                    <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="VerticalScrollBar" />
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="NotScrolling" />
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Grid Margin="{TemplateBinding Padding}">
                        <i:Interaction.Triggers>
                            <!-- HERE I CANT BIND TO COUNT -->
                            <ec:DataTrigger Binding="{TemplateBinding ItemsSource}" Comparison="Equal" Value="0">
                                <ec:ChangePropertyAction TargetObject="{Binding ElementName=EmptyListText}" PropertyName="Visibility" Value="Visible" />
                            </ec:DataTrigger>
                        </i:Interaction.Triggers>
                        <ViewportControl x:Name="ViewportControl" HorizontalContentAlignment="Stretch" VerticalAlignment="Top" />
                        <ScrollBar x:Name="VerticalScrollBar" Opacity="0" Background="{StaticResource ThemeBackground}" HorizontalAlignment="Right" Orientation="Vertical" />
                        <TextBlock x:Name="EmptyListText" Visibility="Collapsed" Text="{Binding Source={StaticResource Literals}, Path=Literals.noResults}" />
                    </Grid>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【问题讨论】:

    标签: xaml windows-phone-8 longlistselector


    【解决方案1】:

    这是一个数据绑定问题。

    尝试将它附加到 TemplateParent(即 LongListSelector),如下所示:

    <ec:DataTrigger
        Binding="{Binding RelativeSource={RelativeSource Mode=TemplateParent}, Path=ItemsSource.Count}"
        Comparison="Equal" Value="0">
    </ec:DataTrigger>
    

    如果你想使用触发器,那应该会让你直截了当。


    我喜欢使用Converters。它更容易理解,所以这里是使用转换器的完整解决方案。

    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Windows.Data;
    
    public class MyConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null)
                return Visibility.Collapsed;
            else
            {
                if (value is System.Collections.IList)
                {
                    System.Collections.IList list = (System.Collections.IList)value;
                    if (list.Count == 0)
                        return Visibility.Collapsed;
                    else
                        return Visibility.Visible;
    
                }
                else
                    return Visibility.Collapsed;                
            }
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return null;
        }
    }
    

    所以 LongListSelector 样式是:

    <TextBlock Visibility="{Binding ItemsSource, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource MyConverter}}"></TextBlock>
    

    【讨论】:

    • 效果很好!但是在您的第一个示例中,缺少一个 Binding 单词。应该是:Binding="{Binding RelativeSource={RelativeSource Mode=TemplateParent}, Path=ItemsSource.Count}"
    • @MarcelodeAguiar 有一段时间没有使用行为/触发器了,感谢 cmets。我会改变它。很高兴它对你有效。 :)
    【解决方案2】:

    根据长列表选择器创建一个自定义复合控件,它可以执行所需的操作,并且具有根据依赖属性显示特定消息的智能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多