0

リストの「最後の」アイテムだけに、ListView アイテムの下部コーナー半径を設定したいと思います。私はコンバーター(実際には最後の行を見つけます)でそうしようとしましたが、役に立ちませんでした。

望ましい効果は、ListView 内の最後の項目を見つけた後に Converter が true を返したときです。最後の ListViewItem の境界線 CornerRadius は、CornerRadius="0,0,10,10" に設定されます。ListView の他のすべての項目については、CornerRadius="0,0,0,0"

私がこれまでにやってきたこと。

コンバーター...

public class IsLastItemConverter : IValueConverter
   {
       #region IValueConverter Members
       public object TrueValue { get; set; }
       public object FalseValue { get; set; }

       public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
       {
        ListViewItem item = value as ListViewItem;
        ListView listView = ItemsControl.ItemsControlFromItemContainer(item) as ListView;
        if (listView != null)
        {

            int index = listView.ItemContainerGenerator.IndexFromContainer(item);
            if (index == listView.Items.Count - 1)
            {
                TrueValue = true;
                return (bool)TrueValue;
            }
            else
            {
                FalseValue = false;
                return (bool)FalseValue;
            }

        }
            FalseValue = false;
            return (bool)FalseValue;
       }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
       {
        // Just Convert Back
        return true;
       }
       #endregion
   }

XAML...

<local:IsLastItemConverter x:Key="lastItemConverter" 
                                   TrueValue="0,0,10,10" FalseValue="0,0,0,0"/>


<DataTemplate x:Key="CellContentTemplate">
                        <Border 
                            x:Name="CellContentBorder"
                            Background="{StaticResource GrayCharcoal}"                          
                            BorderThickness="4,4,4,4"                           
                            BorderBrush="{StaticResource Gray}"
                            CornerRadius="{Binding Converter={StaticResource lastItemConverter}, 
                            RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}}"
                            HorizontalAlignment="Left" 
                            Width="210" 
                            Height="50"                         
                            ContextMenu="{StaticResource MarginalUnitsContextMenu}" 
                            ScrollViewer.VerticalScrollBarVisibility="Hidden">...

考えやアイデアは大歓迎です - Glenn

4

1 に答える 1

0

文字列の代わりに実際の CornerRadius を返そうとします (これは基本的に返されます)。

私の仮定は次のとおりです。 xaml で文字列 "0,0,0,0" を CornerRadius として渡す場合、適切な Converter を使用して、この文字列を CornerRadius 構造体に変換します。

現在カスタム コンバーターを使用しているため、CornerRadius コンバーターへの文字列は使用されていない可能性があります...

EDIT(クレメンスの回答に照らして):プロパティのコンバーターは、バインディングに関連付けられたカスタムコンバーターから文字列が返されたときに作動するようです! これは、CornerRadius に TypeConverter が関連付けられているためです。

[TypeConverterAttribute(typeof(CornerRadiusConverter))]
public struct CornerRadius : IEquatable<CornerRadius>

この変換を処理します。このコンバーターは、文字列から CornerRadius への変換を処理します。( http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverterattribute.aspxから取得)

于 2013-04-29T12:24:47.310 に答える