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

Pap*_*ohn 7 c# wpf xaml

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

public AjustControl(BaoC input)
        {
            InitializeComponent();

            populateAdjustControl(input);

        }
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*ski 22

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

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

public AjustControl()
{
    InitializeComponent();
}
Run Code Online (Sandbox Code Playgroud)

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

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

在此之后,您可以使用您的控件

<custom:AjustControl Name="something" />
Run Code Online (Sandbox Code Playgroud)

  • 确实.我最后使用`Loaded`事件加载我的数据,因为此时设置了DP.谢谢 ! (3认同)

Pat*_*erg 5

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

  1. 这可能是因为您需要自定义控件来使用有问题的参数,然后才能通过依赖属性机制将任何绑定值从自定义控件传递到父级 - 最明显的是会直接或间接使用有问题的构造函数参数的绑定属性。

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

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

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

<MyCustomControl MyParameter="{x:Reference Name=Blah}"/>
Run Code Online (Sandbox Code Playgroud)

代替

<MyCustomControl MyNonParameter="{Binding ElementName=Blah}"/>
Run Code Online (Sandbox Code Playgroud)

您不必为此创建 DP。在你的自定义控件中你可以写

class MyCustomControl {
    // The parameter my constructor sadly can not have
    public MyParameterType MyParameter { get; set; }
Run Code Online (Sandbox Code Playgroud)