2017-07-07 47 views
0

我有一個StepsWnd窗口,其中UserControl StepProp被使用兩次,在一個單獨的文件中聲明。如何將參數從xaml標記文件傳遞給UserControl構造函數?

<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

在StepProp中定義一個依賴項屬性,將其設置在StepsWnd中,對此屬性更改處理程序進行自定義。 –

+1

當您在XAML中創建元素作爲標記時,只能調用無參數的構造函數。 swiszcz的建議是「參數化」用戶控制的傳統方式。 –

回答

1

如何傳遞的參數,從StepsWnd窗口標記的StepProp類的構造函數,這樣我可以確認誰在調用構造函數,m_PrevStep或m_CurStep?

你不行。 XAML是標記語言,您不能使用任何其他構造函數創建UserControl的實例,該構造函數不包含不接受任何參數的默認構造函數。所以忘記在XAML中使用依賴注入。

如果你想構造的行爲不同,這取決於你正在創建哪個實例,你應該考慮創建兩個不同UserControl類型例如可以共享同一個基類或彼此繼承。

另外,您可以定義和設置屬性的建議的意見:

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

...和處理的二傳手或財產的任何邏輯(或回調,如果你要定義一個依賴屬性格式) 。

請注意,該屬性值在構造函數中將不可用,但實例必須在XAML processer可以真正設置屬性之前創建。

相關問題