样式列表框与特殊的最终ListBoxItem(Silverlight 5 / WPF)

时间:2012-01-27 21:05:28

标签: c# .net wpf silverlight xaml

如果我在列表框样式,有时我会在每个元素之间有一个分隔符。但我不希望最后一个元素下面的分隔符。

the problem

我可以使用某种转换器技巧来获取此功能吗? (Silverlight 5)

感谢以下帖子:

XAML:

<UserControl
    x:Class="SilverlightApplication41.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SilverlightApplication41"
    Width="640" Height="480">

    <UserControl.Resources>
        <local:NotLastItemToVisibilityConverter x:Key="NotLastItemToVisibilityConverter"/>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="White">
        <Border Background="#EEEDED" HorizontalAlignment="Left" VerticalAlignment="Center">
            <ListBox x:Name="_listbox" Background="#FFEEEDED" BorderBrush="#FF585858">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid Margin="2">
                            <TextBlock Text="{Binding}"/>
                            <Rectangle Fill="Orange" Height="2" VerticalAlignment="Bottom" Margin="1,0,1,-2"
                                       Visibility="{Binding Converter={StaticResource NotLastItemToVisibilityConverter}}"/>
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </Border>
    </Grid>
</UserControl>

CS:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Data;
using System.Collections.Generic;

namespace SilverlightApplication41
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            // Required to initialize variables
            InitializeComponent();
            List<string> dataList = new List<string>(){"Ants", "Bats", "Cats", "Dogs", "Entoloma sinuatum"};
            ((NotLastItemToVisibilityConverter)Resources["NotLastItemToVisibilityConverter"]).DataList = dataList;
            _listbox.ItemsSource = dataList;
        }

    }

    public class NotLastItemToVisibilityConverter : IValueConverter
    {
        public List<string> DataList {get; set;}

        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if(DataList.Count == 0 || (string)value == DataList[DataList.Count-1])
            {
                return Visibility.Collapsed;
            }
            return Visibility.Visible;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}

注意: 比较需要是对象比较或列表中的唯一字符串。否则,列表A,B,A将仅在B之后具有分频器,因为“A”==“A”。所以这是使用字符串的一个不好的例子,但是说得好。我尝试将DataList [DataList.Count-1]转换为对象,但似乎绑定不使用传入的确切字符串。

1 个答案:

答案 0 :(得分:1)

是的,会有一些转换器诡计。

将分隔符的可见性绑定到列表项。然后在转换器中检查返回true是否不是列表中的.Last()项,如果不是false则返回{{1}}。您需要访问转换器中的视图模型。

我现在没有代码,但我已经做了类似的事情来启用/禁用按钮。

相关问题