如何从XAML传递参数?

34

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

唯一的问题是,我必须向时钟控件的构造函数传递参数,但我不知道如何做到这一点。

如果没有参数,可以这样做:

<myControl:ClockControl></myControl:ClockControl>

但是我该如何在这样做的同时传递参数呢?

这是构造函数:

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

提前感谢。


类似问题https://dev59.com/Q3NA5IYBdhLWcg3wH6EW - Yang C
4个回答

66
你的构造函数:
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}" />

希望这能解决你的问题!


终于!有人知道我想要什么了...! - Vahid
1
@Nawaz,约翰想要的和他需要的可能并不相同。现在在XAML中有x:Reference属性,因此最好使用不同的解决方法。你介意审核一下吗?据我所知,在XAML中尚未提供适当的构造函数参数传递。 - Patrick Fromberg

4
这是通过使用DependencyProperty实现的,但并不是通过构造函数实现的。只需将属性添加到控件本身,并从代码后台中使用它们即可。
请参阅以下有关DependencyProperty的内容: 作为一个视觉提示,这将允许您执行以下操作,并在代码后台中使用它:
<myControl:ClockControl City="New York"></myControl:ClockControl>

1
在构造函数中使用属性?'New York' 值将何时被设置? - Snowbear
@Snowbear - 这完全不是我说的。你的投票是负面评价吗? - Kyle Rosendo
@Kyle Rozendo - 是的,那个踩你的回答是我。你在.ctor代码中的最后一行似乎有误,这就是我为什么会踩你的回答并点赞之前那个回答的原因。 - Snowbear
@Snowbear - 有什么不对吗?这是伪代码,说明如何实现它。我有三个链接,完全解释了如何实现它,以及理解依赖属性的后端工作原理。我不明白这怎么能成为负投票的理由。 - Kyle Rosendo
@Snowbear - 这正是我所说的。如果您阅读示例代码,它A.没有参数化构造函数, B.通过依赖属性传递“New York”。引用我的答案,我说“这是使用DependencyProperty完成的,但不是通过构造函数。” - Kyle Rosendo
显示剩余3条评论

1

0

可以通过简单绑定控件的 Tag 属性来简化此操作。这样做可能不太优雅,但快捷实用,而且节省了添加另一个属性的时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接