如何将参数从xaml标记文件传递给UserControl构造函数?

时间:2017-07-07 14:01:50

标签: c# wpf xaml user-controls

我有一个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
        }
    }
    //...
}

1 个答案:

答案 0 :(得分:1)

  

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

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

如果您希望构造函数根据您正在创建的实例而有不同的行为,您应该考虑创建两个不同的UserControl类型,例如可以共享相同的基类或从彼此继承。

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

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

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

请注意,属性值在构造函数中不可用,但必须在XAML处理器实际设置属性之前创建实例。