XamlウィンドウからWPFユーザーコントロールコンストラクターにパラメーターを渡す方法は?依存関係プロパティを作成しようとしましたが、失敗します。 xaml拡張機能を試す必要がありますか、それとも他の方法がありますか?
<local:Myusercontrol Param1="user1"/>
呼び出し元のWindow
のxaml.cs、まあそのユーザーコントロール。
public partial class SomeView : UserControl
{
SomeViewModel vm = new SomeViewModel();
public SomeView()
{
this.DataContext = vm;
InitializeComponent;
}
}
上記のウィンドウのInitializeComponent
は、ユーザーコントロールのインスタンスを作成する前に、xamlを介して設定された依存関係プロパティの値をクリアするため、依存関係プロパティの値は常にnullになります。
およびusercontrolのxaml.cs
Myusercontrol : UserControl
{
public Myusercontrol (string User)
{
InitializeComponent();
UserControlViewModel vm = new UserControlViewModel (User);
this.DataContext = vm;
}
MVVMパターンを使用していることに注意してください。
XAMLは、パラメーターでコンストラクターを使用できません。依存関係プロパティで試したことを保持します:
<local:Myusercontrol Param1="user1"/>
次に、コンストラクターでこれを試すことができます:
public Myusercontrol()
{
InitializeComponent();
Loaded += (sender, args) =>
{
UserControlViewModel vm = new UserControlViewModel(Param1);
this.DataContext = vm;
};
}
XAMLからユーザーコントロールにパラメーターを渡していますが、これは機能しません。 XAMLからユーザーコントロールを呼び出すと、ユーザーコントロールのデフォルトコンストラクターが呼び出されるためです。あなたの場合、パラメーターなしのコンストラクターは作成していません。パラメータMyusercontrol (string User)
を持つもう1つは呼び出されません。
最良のオプションは、ユーザーコントロール用のパラメーターなしのコンストラクターのみを使用し、それ以上は使用しないことです。
public Myusercontrol()
{
InitializeComponent();
}
ユーザーコントロールにMVVMを使用しているので、ユーザーコントロールをホストするウィンドウにMVVMを使用する必要があります-それと同じくらい簡単です:)
そこで、UserControlViewModel
のプロパティを作成し、そのインスタンスを作成する必要があります。そうすると、ユーザーコントロールのDatacontextをそのViewModelにバインドするのが簡単になります。
ユーザーコントロールが多くの場所で使用される場合は、har07回答をお勧めし、依存関係プロパティを使用します。ただし、コントロールが1〜2回だけ使用され、依存関係プロパティを作成するのが面倒な場合は、いつでもコードからコントロールを作成できます。たとえば、親としてグリッドを作成し、グリッドの子としてコントロールを挿入します
XAML
<Grid Name="Wrapper"></Grid>
コード
MyUserControl userControl = new MyUserControl(param);
Wrapper.Children.Add(userControl);