11
votes

How to pass Parameters from xaml window to WPF usercontrol constructor? I have tried creating dependency property, but it fails to do it. Should I try xaml extensions or is there any other way to do it?

<local:Myusercontrol Param1="user1"/>

xaml.cs of the calling Window, well its usercontrol.

public partial class SomeView : UserControl
{
    SomeViewModel vm = new SomeViewModel();
    public SomeView()
    {
        this.DataContext = vm;
        InitializeComponent;
    }
}

InitializeComponent of above window clears value of dependency property set through xaml before creating an instance of the user control and hence value of depencency property is always null.

and usercontrol's xaml.cs

Myusercontrol : UserControl
{
  public Myusercontrol (string User)
  {
    InitializeComponent();
    UserControlViewModel vm = new UserControlViewModel (User);
    this.DataContext = vm;
  }

Note that I am using MVVM pattern.

3
Try moving InitializeComponent() to after where you set the DataContextDan Busha
@Dan Buscha Tried it. Doesn't help. Initialize Component of the window clears the dependency property and then instantiates the usercontrol.user2330678

3 Answers

14
votes

XAML can't use constructor with parameter. Keep what you've tried with dependency property :

<local:Myusercontrol Param1="user1"/>

then you can try this in constructor :

public Myusercontrol()
{
    InitializeComponent();
    Loaded += (sender, args) =>
          {
                UserControlViewModel vm = new UserControlViewModel(Param1);
                this.DataContext = vm;
          };
}
2
votes

If your user control will be used at many places, i recommend har07 answer and use dependency property. But if your control will be used just once or two times and you're lazy enough to create a dependency property, you can always create your control from code. For example create a grid as parent and insert your control as child of your grid

XAML

<Grid Name="Wrapper"></Grid>

Code

MyUserControl userControl = new MyUserControl(param);
Wrapper.Children.Add(userControl);
2
votes

You are passing a parameter to user control from XAML which will not work. Because if you call your user control from XAML, it is going to call the default constructor of your user control. In your case you haven't created any paramterless constructor. The other one with parameter Myusercontrol (string User) will never get called.

The best option is to have only the paramterless constructor for your User Control and nothing more.

public Myusercontrol()
{
    InitializeComponent();
}

Since you are using MVVM for your user control, you should be using MVVM for the window which hosts the user control - as simple as that :)

There you should create a property for UserControlViewModel and create its instance. If you do that it would be easier for you to bind your user control's Datacontext to its ViewModel.