如何将参数从 xaml 标记文件传递到用户控件构造函数?



我有一个StepsWnd窗口,其中UserControl StepProp被使用了两次,在一个单独的文件中声明。

<Window x:Class="MyProject.StepsWnd"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyProject"
Height="550" Width="850">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<local:StepProp Grid.Column="0" DataContext="{Binding Path=PrevStepVM}" x:Name="m_PrevStep"/>
<local:StepProp Grid.Column="1" DataContext="{Binding Path=CurStepVM}" x:Name="m_CurStep"/>
</Grid>
</Window>

创建 StepsWnd 窗口时,将调用 StepProp 构造函数两次 - 用于m_PrevStep和m_CurStep。

public class StepProp : UserControl
{
public StepProp()
{
InitializeComponent();
}
//...
}

如何从 StepsWnd 窗口的标记将参数传递给 StepProp 类构造函数,以便我可以识别谁在调用构造函数、m_PrevStep或m_CurStep?得到这样的东西?

public class StepProp : UserControl
{
public StepProp(object parameter)
{
InitializeComponent();
if ((string)parameter == "PrevStep")
{
//todo somthing
}
else if ((string)Param == "CurStep")
{
//todo somthing else
}
}
//...
}

如何从 StepsWnd 窗口的标记将参数传递给 StepProp 类构造函数,以便我可以识别谁在调用构造函数、m_PrevStep或m_CurStep?

你不能。XAML 是一种标记语言,除了不接受任何参数的默认构造函数之外,不能使用任何其他构造函数创建UserControl的实例。因此,忘记在 XAML 中使用依赖关系注入。

如果您希望构造函数的行为因要创建的实例而异,则可能应该考虑创建两种不同的UserControl类型,例如,它们可能共享相同的基类或相互继承。

或者,您可以按照注释中的建议定义和设置属性:

<local:StepProp x:Name="m_PrevStep" YourProperty="m_PrevStep" />

。并处理 setter 或属性中的任何逻辑(如果您正在定义依赖项属性,则处理回调(。

请注意,属性值在构造函数中不可用,因为必须先创建实例,然后 XAML 处理器才能实际设置属性。

最新更新