【问题标题】:How do you pass parameters from xaml?如何从 xaml 传递参数?
【发布时间】:2011-06-15 16:40:26
【问题描述】:

我创建了自己的用户控件“ClockControl”,我通过主窗口的 XAML 对其进行了初始化。

唯一的问题是我必须将参数传递给时钟控件的构造函数,而我不知道该怎么做。

如果我没有参数,这可行:

<myControl:ClockControl></myControl:ClockControl>

但是我怎样才能传递一个参数呢?

这里是构造函数:

public ClockControl(String city)
    {
        InitializeComponent();
        this.initController();
        ......
        .....
    }

提前致谢。

【问题讨论】:

标签: c# wpf xaml


【解决方案1】:

x:Arguments directive 将是您所需要的。

【讨论】:

    【解决方案2】:

    可以通过简单地绑定控件的 Tag 属性来简化此操作。快速而肮脏,也许并不过分优雅,但可以节省添加另一个属性的时间。

    【讨论】:

      【解决方案3】:

      这是通过使用DependencyProperty 完成的,但不是通过构造函数。只需将属性添加到控件本身并从代码隐藏中使用它们。

      阅读以下有关 DependencyProperty 的内容:

      作为视觉说明,这将允许您执行以下操作,然后在代码隐藏中使用它:

      <myControl:ClockControl City="New York"></myControl:ClockControl>
      

      【讨论】:

      • 谢谢,我去看看
      • 在构造函数中使用属性?何时设置“纽约”值?
      • @Snowbear - 这根本不是我说的。你的投票是反对票吗?
      • @Kyle Rozendo - 是的,这是我的反对意见。您在 .ctor 代码中的最后一行对我来说似乎是错误的,这就是为什么我对您的答案投了反对票而对上一个答案投了赞成票。
      • @Snowbear - 什么看起来不对?这是关于如何做到这一点的伪真实代码。我有三个链接来解释如何 100% 地实现它,以及了解依赖属性如何工作的后端。我不明白这如何证明投反对票是合理的。
      【解决方案4】:

      你的构造函数:

      public ClockControl(String city)
      {
          InitializeComponent();
          this.initController();
          //...
      }
      

      首先,如果你想使用 XAML 中的ClockControl,那么你需要一个默认构造函数,即不带任何参数的构造函数。所以上面的构造函数是行不通的。

      我建议您定义一个名为 City 的属性,最好是依赖属性,然后从 XAML 中使用它。像这样的:

      public class ClockControl: UserControl
          {
              public static readonly DependencyProperty CityProperty = DependencyProperty.Register
                  (
                       "City", 
                       typeof(string), 
                       typeof(ClockControl), 
                       new PropertyMetadata(string.Empty)
                  );
      
              public string City
              {
                  get { return (string)GetValue(CityProperty); }
                  set { SetValue(CityProperty, value); }
              }
      
              public ClockControl()
              {
                  InitializeComponent();
              }
              //..........
      }
      

      然后你可以用 XAML 写这个:

      <myControl:ClockControl City="Hyderabad" />
      

      由于City 是一个依赖属性,这意味着您甚至可以像这样执行Binding

      <myControl:ClockControl City="{Binding Location}" />
      

      希望能解决您的问题!

      【讨论】:

      • 终于!有人知道我想要什么……!
      • @Nawaz,约翰想要什么和约翰需要什么可能相同也可能不同。使用different workaround 可能会更好,因为我们现在在 XAML 中有x:Reference 属性。你介意复习吗?据我所知,XAML 中尚不支持正确的构造函数参数传递。
      猜你喜欢
      • 2011-12-30
      • 1970-01-01
      • 2012-09-08
      • 2020-08-22
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      相关资源
      最近更新 更多