代码之家  ›  专栏  ›  技术社区  ›  Brent Schooley

如何将多个参数传递给wpf markupextension中的params数组?

wpf
  •  5
  • Brent Schooley  · 技术社区  · 16 年前

    我需要为我的WPF应用程序创建一个markupextension,它需要能够接受任意数量的参数,这些参数将用于国际化字符串中的令牌替换。我们的国际化代码使用一个参数数组来获取这些参数。由于我希望这些参数可以从XAML传递,有没有一种方法可以指定这些参数而不在XAML中显式创建x:数组?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Nir    16 年前

    我认为您必须使用x:数组,我不知道任何其他方法(甚至无法想到任何其他与标记扩展语法兼容的方法)。

        2
  •  0
  •   Maël Pedretti    6 年前

    有时候不好看,但是蛮力会让你…

    来源:

    [MarkupExtensionReturnType(typeof(PriorityBinding))]
    public sealed class Priority:MarkupExtension {
    
    readonly BindingBase[] bindings;
    
    #region Constructors
    public Priority(BindingBase b1) {
      bindings = new [] {b1};
    }
    
    public Priority(BindingBase b1, BindingBase b2) {
      bindings = new [] {b1, b2};
    }
    
    public Priority(BindingBase b1, BindingBase b2, BindingBase b3) {
      bindings = new [] {b1, b2, b3};
    }
    
    public Priority(BindingBase b1, BindingBase b2, BindingBase b3, 
                     BindingBase b4) {
      bindings = new [] {b1, b2, b3, b4};
    }
    
    public Priority(BindingBase b1, BindingBase b2, BindingBase b3,
                     BindingBase b4, BindingBase b5) {
      bindings = new [] {b1, b2, b3, b4, b5};
    }
    
    public Priority(BindingBase b1, BindingBase b2, BindingBase b3,
                     BindingBase b4, BindingBase b5, BindingBase b6) {
      bindings = new [] {b1, b2, b3, b4, b5, b6};
    }
    
    public Priority(BindingBase b1, BindingBase b2, BindingBase b3,
                     BindingBase b4, BindingBase b5, BindingBase b6, BindingBase b7) {
      bindings = new [] {b1, b2, b3, b4, b5, b6, b7};
    }
    
    public Priority(BindingBase b1, BindingBase b2, BindingBase b3,
                     BindingBase b4, BindingBase b5, BindingBase b6, BindingBase b7, BindingBase b8) {
      bindings = new [] {b1, b2, b3, b4, b5, b6, b7, b8};
    }
    
    #endregion
    
    public override object ProvideValue(IServiceProvider serviceProvider) {
      var binding = new PriorityBinding();
      foreach (var item in bindings) {
        binding.Bindings.Add(item);
      }
      return binding;
    }
    

    }