2012-01-27 12 views
0

リストボックスをスタイリングしている場合、各要素の間に仕切り線があることがあります。しかし、私はその仕切りを最終要素の下には望んでいません。特別な最終ListBoxItem(Silverlight 5/WPF)を使用したリストボックスのスタイル設定

the problem

私はこれを取得するために使用できるコンバータ策略のいくつかの並べ替えがありますか? (シルバー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]をオブジェクトにキャストしようとしましたが、バインディングが渡された正確な文字列を使用していないように見えます。

答えて

1

はい、いくつかの変換器のトリッキーがあります。

ディバイダの可視性をリスト項目にバインドします。コンバータのチェックで、trueがリストに.Last()の項目でない場合は返し、それがある場合はfalseを返します。コンバータのビューモデルにアクセスする必要があります。

私は今すぐに手渡すコードはありませんが、私はボタンを有効/無効にするためにこのようなことをしました。

+0

賢い、ありがとう。私はコードを書いて元の投稿に投げます。 – shane

関連する問題