wpf数据绑定网格行可见性

时间:2011-01-24 18:47:41

标签: wpf data-binding forms visibility

我有一个窗口,其网格就像一个表格。窗口不是我自己的,并且有一个新要求是不根据用户选择的上下文显示(即,折叠)第4行和第5行。

我能想到的两件事就是:

  1. 在行内容上有一个转换器,如果为真,则会占用bool并折叠可见性。
  2. 在网格行高度属性上有转换器。
  3. 我更喜欢后者,但是无法获得转换器的输入值。转换器代码和绑定如下。

    有人能告诉我绑定应该是什么样的?有没有更简单的方法来做到这一点?

    转换器代码

    [ValueConversion(typeof(GridLength), typeof(Visibility))]
    public class GridLengthToCollapseVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
    
            if (value == null || parameter == null) return Binding.DoNothing;
    
            var result = (GridLength) value;
            bool shouldCollapse;
            Boolean.TryParse(parameter.ToString(), out shouldCollapse);
            return shouldCollapse ? new GridLength() : result;
    
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); }
    }
    

    绑定(这是我被困的地方)

    假设我希望高度的值为30,除非绑定的ShowLastName属性为true。 下面的绑定不对,但是什么?

     <RowDefinition Height="{Binding Source=30, Converter={StaticResource GridLengthToCollapseVisibilityConv},ConverterParameter=ShowLastName}" />
    

    工作解决方案

    [ValueConversion(typeof(bool), typeof(GridLength))]
    public class GridLengthToCollapseVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
    
            if (value == null || parameter == null) return Binding.DoNothing;
    
            bool shouldCollapse;
            Boolean.TryParse(value.ToString(), out shouldCollapse);
            return shouldCollapse 
                ? new GridLength(0) 
                : (GridLength) parameter;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); }
    

    }

        <Grid.Resources>
            <cvt:GridLengthToCollapseVisibilityConverter x:Key="GridLengthToCollapseVisibilityConv" />
            <GridLength x:Key="AutoSize">Auto</GridLength>
            <GridLength x:Key="ErrorLineSize">30</GridLength>
        </Grid.Resources>
    
        <Grid.RowDefinitions>
            <RowDefinition Height="{StaticResource AutoSize}" />
            <RowDefinition Height="{StaticResource ErrorLineSize}" />
            <RowDefinition Height="{Binding Path=HideLastName, 
                Converter={StaticResource GridLengthToCollapseVisibilityConv},ConverterParameter={StaticResource AutoSize}}" />
            <RowDefinition Height="{Binding Path=HideLastName, 
                Converter={StaticResource GridLengthToCollapseVisibilityConv},ConverterParameter={StaticResource ErrorLineSize}}" />
        </Grid.RowDefinitions>
    

2 个答案:

答案 0 :(得分:2)

您无法对ConverterParamater进行数据绑定:http://social.msdn.microsoft.com/Forums/en/wpf/thread/88a22766-5e6f-4a16-98a6-1ab39877dd09

如果高度始终相同,为什么不切换值和参数:

<RowDefinition Height="{Binding Source=ShowLastName, Converter={StaticResource GridLengthToCollapseVisibilityConv},ConverterParameter=30}" />

如果您需要对两个值进行数据绑定,则可以使用多值绑定:http://msdn.microsoft.com/en-us/library/system.windows.data.imultivalueconverter.aspx

答案 1 :(得分:0)

您所要做的就是交换Binding和Parameter。


如果您仍希望两个值都是数据绑定,请使用MultiBinding,即使您的第二个值是常量。这是一个黑客攻击,但它是将额外值传递到转换器的最简单方法。