Передача параметров между окном xaml и usercontrol WPF

как передать параметры из окна xaml в конструктор WPF usercontrol? Я попытался создать свойство зависимости, но это не удалось сделать. Должен ли я попробовать расширения xaml или есть другой способ сделать это?

<local:Myusercontrol Param1="user1"/>

в XAML.cs призвания Window, ну его usercontrol.

public partial class SomeView : UserControl
{
    SomeViewModel vm = new SomeViewModel();
    public SomeView()
    {
        this.DataContext = vm;
        InitializeComponent;
    }
}

InitializeComponent вышеуказанного окна очищает значение свойства зависимостей, заданного через xaml перед созданием экземпляра пользовательского элемента управления и, следовательно, значение свойства depencency всегда имеет значение null.

и xaml usercontrol.cs

Myusercontrol : UserControl
{
  public Myusercontrol (string User)
  {
    InitializeComponent();
    UserControlViewModel vm = new UserControlViewModel (User);
    this.DataContext = vm;
  }

обратите внимание, что я использую шаблон MVVM.

3 ответов


XAML не может использовать конструктор с параметром. Сохраните то, что вы пробовали с свойством зависимостей:

<local:Myusercontrol Param1="user1"/>

затем вы можете попробовать это в конструкторе :

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

вы передаете параметр в пользовательский элемент управления из XAML, который не будет работать. Потому что при вызове пользовательского элемента управления из XAML он вызовет конструктор по умолчанию пользовательского элемента управления. В вашем случае вы не создали конструктор без параметров. Другой с параметром Myusercontrol (string User) никогда не будет вызван.

самый лучший вариант-это только конструктор paramterless для контроля пользователей и ничего более.

public Myusercontrol()
{
    InitializeComponent();
}

Так как вы используете MVVM для ваш пользовательский элемент управления, вы должны использовать MVVM для окна, в котором размещается пользовательский элемент управления - так просто:)

там вы должны создать свойство для UserControlViewModel и создать его экземпляр. Если вы это сделаете, вам будет проще привязать Datacontext вашего пользовательского элемента управления к его ViewModel.


Если ваш пользовательский элемент управления будет использоваться во многих местах, я рекомендую har07 ответить и использовать свойство зависимостей. Но если элемент управления будет использоваться только один или два раза, и вы достаточно ленивы, чтобы создать свойство зависимостей, вы всегда можете создать элемент управления из кода. Например, создайте сетку как родительскую и вставьте элемент управления как дочерний элемент вашей сетки

XAML

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

код

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