如何将参数从xaml窗口传递给WPF usercontrol构造函数? 我已经尝试创建依赖属性,但它无法做到。 我应该尝试xaml扩展还是有其他方法可以做到这一点?
<local:Myusercontrol Param1="user1"/>
调用Window
的xaml.cs,以及它的用户控件。
public partial class SomeView : UserControl
{
SomeViewModel vm = new SomeViewModel();
public SomeView()
{
this.DataContext = vm;
InitializeComponent;
}
}
上面窗口的 InitializeComponent
在创建用户控件的实例之前清除通过xaml设置的依赖项属性的值,因此depencency属性的值始终为null。
和usercontrol的xaml.cs
Myusercontrol : UserControl
{
public Myusercontrol (string User)
{
InitializeComponent();
UserControlViewModel vm = new UserControlViewModel (User);
this.DataContext = vm;
}
请注意,我使用的是MVVM模式。
答案 0 :(得分:10)
XAML不能使用带参数的构造函数。保留您使用依赖属性尝试的内容:
<local:Myusercontrol Param1="user1"/>
然后你可以在构造函数中尝试这个:
public Myusercontrol()
{
InitializeComponent();
Loaded += (sender, args) =>
{
UserControlViewModel vm = new UserControlViewModel(Param1);
this.DataContext = vm;
};
}
答案 1 :(得分:2)
您正在从XAML向用户控件传递参数,这将无效。因为如果从XAML调用用户控件,它将调用用户控件的默认构造函数。在你的情况下,你没有创建任何无参数的构造函数。参数Myusercontrol (string User)
的另一个永远不会被调用。
最好的选择是只为用户控件设置无参数构造函数,仅此而已。
public Myusercontrol()
{
InitializeComponent();
}
由于您使用MVVM进行用户控制,因此您应该将MVVM用于托管用户控件的窗口 - 就这么简单:)
您应该为UserControlViewModel
创建一个属性并创建其实例。如果这样做,您将更容易将用户控件的Datacontext绑定到其ViewModel。
答案 2 :(得分:0)
如果您的用户控件将在许多地方使用,我建议使用har07应答并使用依赖属性。但是如果您的控件只使用一次或两次并且您懒得创建依赖项属性,则始终可以从代码创建控件。例如,将网格创建为父级,并将控件作为网格的子级插入
XAML
<Grid Name="Wrapper"></Grid>
代码
MyUserControl userControl = new MyUserControl(param);
Wrapper.Children.Add(userControl);