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

本文关键字:参数 构造函数 控制 WPF | 更新日期: 2023-09-27 18:18:52

我已经写了我的控件,并试图传递参数进行额外的初始化,但有错误=((TYPE Ajustcontrol不能有一个名称属性)。如何正确传递数据?这是我的c#代码:

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

错误:错误15类型'AjustControl'不能有Name属性。值类型和没有默认构造函数的类型可以用作ResourceDictionary中的项。第470行,位置26。D: '撮合下' aaa '主窗口。xaml 470 26 Studio

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

所以,正如错误所示。在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. 这可能是因为你需要自定义控件在任何绑定值通过依赖属性机制从自定义控件传递给父控件之前消费有问题的参数——最明显的是绑定属性会直接或间接地消费有问题的构造函数参数。

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

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

但是普通的点网属性可能存在问题。如何绑定到引用?可视化树中的控件,例如?有一种解决方案可以解决这个问题,但只能在较新版本的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; }