【问题标题】:WPF Converter with Property in Static Resource静态资源中具有属性的 WPF 转换器
【发布时间】:2020-12-21 13:06:16
【问题描述】:

我有一个转换器,它有一个属性 VisibleLength

public class BoolToGridLengthConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((bool)value == true) ? new GridLength(0) : new GridLength(VisibleLength);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }

    public double VisibleLength { get; set; }
}

在 App.xaml 中,我将资源定义为

<Application.Resources>
    <ns:BoolToGridLengthConverter
        x:Key="boolToGridLengthConverter"
     />
</Application.Resources>

并在 xaml 中用作

<RowDefinition Height="{Binding Path=boolProperty, Converter={StaticResource boolToGridLengthConverter}}" />

如何使用该属性将 VisibleLenght property=doubleValue 从 xaml 传递给转换器。

【问题讨论】:

    标签: wpf converters staticresource


    【解决方案1】:

    如果您希望VisibleLength 对于转换器的所有用法都相同,那么就这样做

    <ns:BoolToGridLengthConverter x:Key="..." VisibleLength="40"/>
    

    但是,这听起来有点像您想在使用站点上做出此决定。在这种情况下,您可以从转换器类中删除该属性,而是使用参数:

    <RowDefinition
        Height="{Binding Converter={StaticResource boolToGridLengthConverter}, ConverterParameter=40, Path=boolProperty}"
    />
    

    您的实现更改如下:

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool)value ? new GridLength(0) : new GridLength(Convert.ToDouble(parameter));
    }
    

    【讨论】:

      【解决方案2】:

      您甚至可能根本不需要绑定转换器。

      只需在 RowDefinition 样式中使用 DataTrigger:

      <RowDefinition>
          <RowDefinition.Style>
              <Style TargetType="RowDefinition">
                  <Setter Property="Height" Value="40"/>
                  <Style.Triggers>
                      <DataTrigger Binding="{Binding boolProperty}" Value="True">
                          <Setter Property="Height" Value="0"/>
                      </DataTrigger>
                  </Style.Triggers>
              </Style>
          </RowDefinition.Style>
      </RowDefinition>
      

      (可选)将样式声明为资源:

      <Application.Resources>
          <Style x:Key="RowDefStyle" TargetType="RowDefinition">
              <Setter Property="Height" Value="40"/>
              <Style.Triggers>
                  <DataTrigger Binding="{Binding boolProperty}" Value="True">
                      <Setter Property="Height" Value="0"/>
                  </DataTrigger>
              </Style.Triggers>
          </Style>
      </Application.Resources>
      
      ...
      <RowDefinition Style="{StaticResource RowDefStyle}"/>
      

      【讨论】:

      • 一般来说,DataTrigger 应该比 Converter 轻一点,对吧?至少我注意到默认的 WPF 样式对触发器做了很多工作,而年轻的我可能会使用转换器。
      • IMO 的优点是您只有 XAML 声明,而转换器类中没有任何附加代码。更清楚地看到它的行为方式。
      猜你喜欢
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 2022-12-04
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      相关资源
      最近更新 更多