I have created my own UserControl "ClockControl", which I initialize through the main window's XAML.
The only problem is that I have to pass a parameter to the constructor of the clock control, and I have no clue of I how I can do that.
This works if I have no parameters:
<myControl:ClockControl></myControl:ClockControl>
But how can I pass a parameter doing this?
Here is the constructor:
public ClockControl(String city)
{
InitializeComponent();
this.initController();
......
.....
}
Thanks in advance.
Your constructor:
public ClockControl(String city)
{
InitializeComponent();
this.initController();
//...
}
First of all, if you want to use ClockControl
from XAML, then you need a default constructor, means a constructor which doesn't take any parameter. So the above constructor is not going to work.
I would suggest you to define a property with name City
, preferably dependency property, and then use it from XAML. Something like this:
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();
}
//..........
}
Then you can write this in XAML:
<myControl:ClockControl City="Hyderabad" />
Since City
is a dependency property, that means you can even do Binding
like this:
<myControl:ClockControl City="{Binding Location}" />
Hope, that solves your problem!
This is done with the use of DependencyProperty
's, however not via the constructor. Just by adding properties to the control itself and using them from the code-behind.
Have a read of the following in regards to DependencyProperty's:
- Dependency Properties Overview
- DependencyProperty Class MSDN
- Why Dependency Properties?
As a visual note, what this will allow you to do is the following, and then use it in the code-behind:
<myControl:ClockControl City="New York"></myControl:ClockControl>
x:Arguments directive would be what you need.
Could simplify this by simply binding the Tag property of the control. Quick and dirty, and perhaps not overly elegant, but saves times adding another property.