【问题标题】:How to pass a variable as Converterparameter in WPF如何在 WPF 中将变量作为 Converterparameter 传递
【发布时间】:2014-12-03 11:46:46
【问题描述】:

我正在尝试将后面代码中定义的变量传递为ConverterParameter。我将在转换器中使用这个参数,然后决定一些单位转换。问题是我不知道如何通过这个。变量不是静态的。

<TextBox Text="{Binding MinimumRebarsVerticalDistance, Converter={StaticResource LengthConverter}, ConverterParameter={CurrentDisplayUnit}}"/>

背后的代码:

private Units currentDisplayUnit;
public Units CurrentDisplayUnit
{
    get { return currentDisplayUnit; }
    set
    {
        currentDisplayUnit = value;
        RaisePropertyChanged("CurrentDisplayUnit");
    }
}

【问题讨论】:

标签: c# wpf


【解决方案1】:

您可以为此使用MultiBinding
首先,将LengthConverter实现为IMultiValueConverter

public sealed class LengthConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        // values array will contain both MinimumRebarsVerticalDistance and 
        // CurrentDisplayUnit values
        // ...
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        // ...
    }
}

其次,用多重绑定绑定TextBox.Text

        <TextBox.Text>
            <MultiBinding Converter="{StaticResource LengthConverter}">
                <Binding Path="MinimumRebarsVerticalDistance"/>
                <Binding Path="CurrentDisplayUnit" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}"/>
            </MultiBinding>
        </TextBox.Text>

注意 1:RelativeSource.AncestorType 取决于 CurrentDisplayUnit 属性的声明位置(示例是用于窗口后面的代码)。

注意 2:看起来 CurrentDisplayUnit 应该是一个视图模型属性。

【讨论】:

  • 非常感谢,非常有帮助。
  • 顺便说一下,在我的实际代码中,CurrentDisplayUnit 是一个视图模型属性。我仍然需要多重绑定,还是这会改变解决方案?
【解决方案2】:

我遇到过类似的情况,我需要根据用户设置的值显示带有小数位数的双精度数。我使用单例解决了它。

MyConfiguration.cs

   public sealed class MyConfiguration
   {
      #region Singleton
      private static readonly Lazy<MyConfiguration> lazy = new Lazy<MyConfiguration>(() => new MyConfiguration());
      public static MyConfiguration Instance { get { return lazy.Value; } }
      private MyConfiguration() {}
      #endregion

      public int NumberOfDecimals { get; set; }
   }

MyConverters.cs

   /// <summary>
   /// Formats a double for display in list
   /// </summary>
   public class DoubleConverter : IValueConverter
   {
      public object Convert(object o, Type type, object parameter, CultureInfo culture)
      {

         //--> Initializations
         IConvertible iconvertible__my_number = o as IConvertible;
         IConvertible iconvertible__number_of_decimals = parameter as IConvertible;

         //--> Read the value
         Double double__my_number = iconvertible__my_number.ToDouble(null);

         //--> Read the number of decimals       
         int number_of_decimals = MyConfiguration.Instance.NumberOfDecimals; // get configuration
         if (parameter != null)  // the value can be overwritten by specifying a Converter Parameter
         {
            number_of_decimals = iconvertible__number_of_decimals.ToInt32(null);
         }

         //--> Apply conversion
         string string__number = (Double.IsNaN(double__number)) ? "" : (number_of_decimals>=0) ? Math.Round(double__my_number, number_of_decimals).ToString(): double__my_number.ToString();

         return string__number;
      }

      public object ConvertBack(object o, Type type, object parameter, CultureInfo culture)
      {
         throw new NotSupportedException();
      }
   }

必须在调用 XALM 表单之前设置 NumberOfDecimals。

MyConfiguration.Instance.NumberOfDecimals = user_defined_value;

【讨论】:

    【解决方案3】:

    ConverterParameter 不是依赖属性,你不能在这里绑定任何变量。

    【讨论】:

    • 那我应该如何将变量传递给ConverterParameter?
    猜你喜欢
    • 2012-04-23
    • 2010-12-25
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2021-11-13
    • 2023-03-06
    相关资源
    最近更新 更多