【问题标题】:Passing Parameters between xaml window and usercontrol WPF在 xaml 窗口和用户控件 WPF 之间传递参数
【发布时间】:2014-03-10 04:02:48
【问题描述】:

如何将参数从 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 设置的依赖属性的值,因此依赖属性的值始终为空。

和usercontrol的xaml.cs

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

请注意,我使用的是 MVVM 模式。

【问题讨论】:

  • 尝试将 InitializeComponent() 移到设置 DataContext 的位置之后
  • @Dan Buscha 试过了。没有帮助。窗口的初始化组件清除依赖属性,然后实例化用户控件。

标签: c# .net wpf xaml mvvm


【解决方案1】:

XAML 不能使用带参数的构造函数。保留您对依赖属性的尝试:

<local:Myusercontrol Param1="user1"/>

那么你可以在构造函数中试试这个:

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

【讨论】:

  • 我怀疑这会奏效。我们有 Param1 作为依赖属性。参数less constructorMyusercontrol 将在Param1 设置之前执行。你不觉得new UserControlViewModel(Param1);会抛出空引用异常吗?
  • 更新了我的答案。你说得对,依赖道具还没有在构造函数中初始化,所以我把DataContext初始化代码移到Loaded事件中。
  • @har07 没有帮助。 Window的Initialize Component清除依赖属性,然后实例化用户控件。
【解决方案2】:

如果你的用户控件会在很多地方使用,我推荐 har07 answer 并使用依赖属性。但是,如果您的控件将只使用一次或两次,并且您懒得创建依赖属性,那么您始终可以从代码中创建您的控件。例如,创建一个网格作为父级,并将您的控件作为网格的子级插入

XAML

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

代码

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

【讨论】:

  • 我正在使用 MVVM 模式。您能否详细说明如何通过使用 MVVM 模式的代码来做到这一点?请注意,我的网格有一些通过 xaml 添加的控件。我必须在网格的一个单元格中放置一个 contentControl 吗?如何通过 Viewmodel 访问该单元格或 ContentControl?
【解决方案3】:

您将参数从 XAML 传递给用户控件,这将不起作用。因为如果您从 XAML 调用您的用户控件,它将调用您的用户控件的默认构造函数。在您的情况下,您还没有创建任何无参数构造函数。带有参数Myusercontrol (string User) 的另一个永远不会被调用。

最好的选择是只为您的用户控件提供无参数构造函数,仅此而已。

public Myusercontrol()
{
    InitializeComponent();
}

由于您将 MVVM 用于用户控件,因此您应该将 MVVM 用于承载用户控件的窗口 - 就这么简单:)

您应该在那里为UserControlViewModel 创建一个属性并创建它的实例。如果您这样做,将用户控件的 Datacontext 绑定到其 ViewModel 会更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多