你如何从xaml传递参数?

时间:2011-01-26 07:38:52

标签: c# wpf xaml

我创建了自己的UserControl“ClockControl”,我通过主窗口的XAML初始化。

唯一的问题是我必须将一个参数传递给时钟控件的构造函数,而且我不知道我该如何做到这一点。

如果我没有参数,这是有效的:

<myControl:ClockControl></myControl:ClockControl>

但是如何传递参数呢?

这是构造函数:

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

提前致谢。

4 个答案:

答案 0 :(得分:60)

你的构造函数:

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}" />

希望,这解决了你的问题!

答案 1 :(得分:4)

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

请阅读以下有关DependencyProperty的内容:

作为一个视觉说明,这将允许您做的是以下内容,然后在代码隐藏中使用它:

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

答案 2 :(得分:1)

x:Arguments directive就是你所需要的。

答案 3 :(得分:0)

可以通过简单地绑定控件的Tag属性来简化这一过程。快速而肮脏,也许并不过分优雅,但节省了添加其他财产的时间。