控件的构造函数都是无参的,这样才可以在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);
}
}
控件也可以按此方式组装,就不重复示范了。
当控件需要在构造函数中接收参数时,可以通过直接在代码后面创建实例并传参,或者使用IOC容器和工厂方法来实现。在XAML中,控件的构造函数通常是无参的,以便直接引用。文中展示了如何在后台代码中直接创建实例以及通过工厂模式配合IOC容器进行组件组装。

1742

被折叠的 条评论
为什么被折叠?



