WPF通过转换器设置边框的角半径

时间:2013-04-29 11:57:06

标签: xaml listview border converter

我想为列表中的“最后”项设置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">...

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

1 个答案:

答案 0 :(得分:0)

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

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

正如您现在使用的是自定义转换器,可能不再使用CornerRadius转换器的字符串...

编辑(根据Clemens的回答):当从与绑定相关联的自定义转换器返回字符串时,属性的Converter似乎确实启动了! 这是因为CornerRadius有一个关联的TypeConverter:

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

处理此转换。此转换器处理从字符串到CornerRadius的转换。 (摘自http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverterattribute.aspx