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

12

我已经编写了我的控件并尝试传递参数进行额外的初始化,但是出现了错误 =((类型Ajustcontrol不能具有名称属性)。如何正确传递数据?以下是我的C#代码:

public AjustControl(BaoC input)
{
    InitializeComponent();
    populateAdjustControl(input);
}

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


请复制粘贴IDE中的原始错误,而不是重新输入。似乎有一些拼写错误。 - Shamim Hafiz - MSFT
我已经根据您的要求更新了我的问题。 - Papa John
1
没有看到更多的代码,很难做出决定。可能只是你打错了一些东西,但很难弄清楚。 - Shamim Hafiz - MSFT
2个回答

29

所以,正如错误信息所说。在XAML中,你不能有没有无参构造函数的控件。如果你想从代码中实例化它,你仍然可以添加一个无参构造函数,但是XAML不会调用该构造函数。

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

public AjustControl()
{
    InitializeComponent();
}

然而,如果你要求给你的控件添加自定义属性,你可以添加一个DependencyProperty

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" />

抱歉挖出这个老答案,但我目前正在尝试实现这个。我的问题是我需要在构造函数中使用此参数(以便能够加载数据)。然而,依赖属性似乎仅在构造函数之后设置。你有什么想法吗? - Shimrod
属性是实例对象的一部分,除非该属性是静态的,否则在使用构造函数实例化类之前不能设置。 - Tomislav Markovski
4
确实。最终我使用了“Loaded”事件来加载我的数据,因为此时DP已设置好。谢谢! - Shimrod
这应该被标记为答案。在谷歌搜索时可以节省时间 ;) - Chakri

5

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

  1. 可能是因为您需要自定义控件在通过依赖属性机制将任何绑定值直接或间接地消耗掉有害的构造函数参数之前进行初始化,尤其是会直接或间接地消耗掉有害构造函数参数的绑定属性。

  2. 可能是因为对于某些原因,仅通过带参数的构造函数进行初始化是您唯一的选择。

我不知道关于情况2是否有任何解决方案。但当出现这种问题时,通常需要满足情况1。在这种情况下,我的解决方案是创建一个普通的 .NET 属性。这将在任何依赖属性之前被解析。

但是,在普通的 .NET 属性中可能存在一个问题。如何绑定引用?例如,可视树中的控件?有一个解决方案,但仅适用于较新版本的 XAML。您可以编写:

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

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

你不需要为此创建DP。在你的自定义控件中,你只需编写以下内容:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接