如何在wpf控件构造函数中传递参数?

时间:2011-12-26 14:45:55

标签: c# wpf xaml

我已经编写了我的控件并尝试传递参数以进行额外的初始化,但是存在错误=((类型Ajustcontrol无法使用名称属性)。如何正确传递数据? 这是我在c#中的代码:

public AjustControl(BaoC input)
        {
            InitializeComponent();

            populateAdjustControl(input);

        }

错误:错误15“AjustControl”类型不能具有Name属性。没有默认构造函数的值类型和类型可以用作ResourceDictionary中的项。第470行位置26. D:\ Prj \ aaa \ MainWindow.xaml 470 26 Studio

2 个答案:

答案 0 :(得分:21)

所以,正如错误所说的那样。在xaml中,如果没有无参数构造函数,则无法进行控制。如果要从代码中实例化它,仍然可以添加一个,但xaml不会调用该构造函数。

public AjustControl(BaoC input) : this()
{
    populateAdjustControl(input);
}

public AjustControl()
{
    InitializeComponent();
}

但是,如果您要求向控件添加自定义属性,则可以添加DependancyProperty

public static readonly DependencyProperty NameProperty= 
    DependencyProperty.Register(
    "Name", typeof(string),
...
    );
public string Name
{
    get { return (string)GetValue(NameProperty); }
    set { SetValue(NameProperty, value); }
}

在此之后,您可以像

一样使用您的控件
<custom:AjustControl Name="something" />

答案 1 :(得分:1)

从您的问题中不清楚为什么需要将参数传递给自定义控件的构造函数。

  1. 这可能是因为您需要自定义控件在任何绑定值通过依赖项属性机制从自定义控件传递给父级之前使用违规参数 - 最明显的绑定属性将直接或间接地使用违规构造函数参数

  2. 这可能是因为通过参数化构造函数进行初始化是出于任何原因的唯一方法。

  3. 我不知道案例2的任何解决方案。但是当出现这个问题时,案例1是通常的要求。在这种情况下,我的解决方案是创建一个普通的dot Net属性。这将在任何依赖属性之前解决。

    但普通的dot Net属性可能存在问题。你如何绑定参考?视觉树中的控件,例如?有一个解决方案,但仅适用于较新版本的XAML。你可以写

    <MyCustomControl MyParameter="{x:Reference Name=Blah}"/>
    

    而不是

    <MyCustomControl MyNonParameter="{Binding ElementName=Blah}"/>
    

    您无需为此创建DP。在您的custrom控件中,您只需编写

    即可
    class MyCustomControl {
        // The parameter my constructor sadly can not have
        public MyParameterType MyParameter { get; set; }