控件的构造函数都是无参的,这样才可以在XAML中直接引用,否则无法编译通过。
若想在构造中入参,可以采用以下方式:
控件定义:
public partial class MyUserControl : UserControl
{
private readonly IBusinessA _businessA;
private readonly IBusinessB _businessB;
public MyUserControl(IBusinessA businessA, IBusinessB businessB)
{
_businessA = businessA;
_businessB = businessB;
InitializeComponent();
}
}
控件的引用MyWindow.xaml:
<Window x:Class="MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d">
<Grid>
<ContentControl x:Name="PART_MyControl" />
</Grid>
</Window>
后台代码MyWindow.xaml.cs:
public partial class MyWindow : Window
{
private readonly IBusinessA _businessA;
private readonly IBusinessB _businessB;
public MyWindow(IBusinessA businessA, IBusinessB businessB)
{
_businessA = businessA;
_businessB = businessB;
InitializeComponent();
PART_MyControl.Content = new MyUserControl(_businessA, _businessB);
}
}
若用IOC容器管理,则可以使用工厂来组装:
public interface IMyWindowFactory
{
IMyWindow GetMyWindow();
}
public interface IMyWindow
{
}
public class MyWindowFactory : IMyWindowFactory
{
private readonly IBusinessA _businessA;
private readonly IBusinessB _businessB;
public MyWindowFactory(IBusinessA businessA, IBusinessB businessB)
{
_businessA = businessA;
_businessB = businessB;
}
public IMyWindow GetMyWindow()
{
return new MyWindow(_businessA, _businessB);
}
}
public partial class MyWindow : Window, IMyWindow
{
private readonly IBusinessA _businessA;
private readonly IBusinessB _businessB;
public MyWindow(IBusinessA businessA, IBusinessB businessB)
{
_businessA = businessA;
_businessB = businessB;
InitializeComponent();
PART_MyControl.Content = new MyUserControl(_businessA, _businessB);
}
}
控件也可以按此方式组装,就不重复示范了。