web-dev-qa-db-ja.com

xamlウィンドウとユーザーコントロールWPFの間でパラメーターを渡す

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パターンを使用していることに注意してください。

10
user2330678

XAMLは、パラメーターでコンストラクターを使用できません。依存関係プロパティで試したことを保持します:

<local:Myusercontrol Param1="user1"/>

次に、コンストラクターでこれを試すことができます:

public Myusercontrol()
{
    InitializeComponent();
    Loaded += (sender, args) =>
          {
                UserControlViewModel vm = new UserControlViewModel(Param1);
                this.DataContext = vm;
          };
}
11
har07

XAMLからユーザーコントロールにパラメーターを渡していますが、これは機能しません。 XAMLからユーザーコントロールを呼び出すと、ユーザーコントロールのデフォルトコンストラクターが呼び出されるためです。あなたの場合、パラメーターなしのコンストラクターは作成していません。パラメータMyusercontrol (string User)を持つもう1つは呼び出されません。

最良のオプションは、ユーザーコントロール用のパラメーターなしのコンストラクターのみを使用し、それ以上は使用しないことです。

public Myusercontrol()
{
    InitializeComponent();
}

ユーザーコントロールにMVVMを使用しているので、ユーザーコントロールをホストするウィンドウにMVVMを使用する必要があります-それと同じくらい簡単です:)

そこで、UserControlViewModelのプロパティを作成し、そのインスタンスを作成する必要があります。そうすると、ユーザーコントロールのDatacontextをそのViewModelにバインドするのが簡単になります。

2
Carbine

ユーザーコントロールが多くの場所で使用される場合は、har07回答をお勧めし、依存関係プロパティを使用します。ただし、コントロールが1〜2回だけ使用され、依存関係プロパティを作成するのが面倒な場合は、いつでもコードからコントロールを作成できます。たとえば、親としてグリッドを作成し、グリッドの子としてコントロールを挿入します

XAML

<Grid Name="Wrapper"></Grid>

コード

MyUserControl userControl = new MyUserControl(param);
Wrapper.Children.Add(userControl);
0
euclid135