リストボックスをスタイリングしている場合、各要素の間に仕切り線があることがあります。しかし、私はその仕切りを最終要素の下には望んでいません。特別な最終ListBoxItem(Silverlight 5/WPF)を使用したリストボックスのスタイル設定
私はこれを取得するために使用できるコンバータ策略のいくつかの並べ替えがありますか? (シルバー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
}
}
注:比較がオブジェクトである必要がありますリスト内のORまたは一意の文字列を比較します。さもなければリストA、B、Aは "A" == "A"以来、Bの後にのみ分周器を持つでしょう。だから、これは文字列を使う悪い例ですが、ポイントを作っています。 DataList [DataList.Count-1]をオブジェクトにキャストしようとしましたが、バインディングが渡された正確な文字列を使用していないように見えます。
賢い、ありがとう。私はコードを書いて元の投稿に投げます。 – shane