【问题标题】:How to pass value to constructor from xaml?如何将值从 xaml 传递给构造函数?
【发布时间】:2014-03-31 03:22:53
【问题描述】:

我想在初始化一个新的UserControl时正确赋值:

public partial class MyUserControl : UserControl
{
    public MyUserControl(int id)
    {
        InitializeComponent();

        //.. do something with id
    }

    // ...
}

是否可以从 xaml 将值传递给构造函数(在我的情况下为 id)?

<CustomControls:MyUserControl />

(是的,我可以定义一个依赖属性或在后面的代码中制作控件,但这无济于事)

【问题讨论】:

  • This is for WPF 但我相信wp8也会有。
  • 我认为没有。
  • 不,据我所知这是不可能的。甚至 XAML 2009 的功能也可以通过 @SriramSakthivel 的链接传递构造函数参数,实际上 usable in WPF,而且在 Windows Phone 中。
  • @har07 谢谢,我不知道,只是通过那个链接分享了。那么这意味着那些 xaml2009 功能在哪里有用?仅来自XamlPad ?
  • 请参阅“如果您想将数据传递给您的控件,更好的选择是 DependencyProperty - 此处的示例。”链接在Romasz answer

标签: c# xaml windows-phone-8 windows-phone


【解决方案1】:

是的,这是可能的。您可以通过编程方式创建用户控件。然后,您可以使用任何您想要的构造函数。这是一个示例:

假设我们有一个用户控件,它在初始化时为文本框赋值:

  public ControlWithP(int i)
        {
            InitializeComponent();
            tb.Text = i.ToString();
        }

将此控件添加到页面:

 public SamplePage()
        {
            InitializeComponent();
            ControlWithP cwp = new ControlWithP(1);
            this.sp.Children.Add(cwp);
        }

其中 sp 是 StackPanel 控件。将用户控件添加到 Grid 也是如此。

查看结果。

这是你想要的吗?

【讨论】:

    【解决方案2】:

    从 XAML-2009 开始,您可以使用 x:Arguments Directive 执行此操作Windows Phone 使用的是 2006(目前),因此这是不可能的。

    因此,要使用 XAML 中的控件,您需要一个默认构造函数(无参数)。

    我认为您可以使用一些解决方法,为此使用专门设计的属性:

    public partial class MyControl : UserControl
    {
        private string myValue = "Default";
        public string MyValue
        {
            get { return myValue; }
            set
            {
                myValue = value;
                // alternatively you can add some code here which 
                // will be invoked after control is created
            }
        }
    
        public MyControl()
        {
            InitializeComponent();
        }
    }
    

    然后在 XAML 中:

    <local:MyControl MyValue="From xaml"/>
    

    在创建控件之后,设置属性并调用它的代码 - 因此它也可以用作创建期间运行的代码的附加部分。

    如果您想将数据传递给您的控件,更好的选择是DependencyProperty - example here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      相关资源
      最近更新 更多