0

我想为列表中的“最后一个”项目设置 ListView 项目的底角半径。我试图用转换器(实际上找到最后一行)来做到这一点,但无济于事。

理想的效果是当Converter在找到ListView的最后一项后返回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">...

非常感谢您的想法和想法 - 格伦

4

1 回答 1

0

我会尝试返回一个真正的 CornerRadius 而不是一个字符串(你实际上是在返回)。

我的假设如下: 在 xaml 中将字符串“0,0,0,0”作为 CornerRadius 传递时,使用适当的转换器将此字符串转换为 CornerRadius 结构。

由于您现在正在使用自定义转换器,因此可能不再使用 CornerRadius Converter 的字符串...

编辑(根据 Clemens 的回答):当从与绑定关联的自定义转换器返回字符串时,该属性的转换器似乎启动了!这是因为 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 回答