【问题标题】:add xaml user control with parameters添加带参数的 xaml 用户控件
【发布时间】:2022-01-28 05:18:54
【问题描述】:

我有一个名为 TransactionTypeEditor 的用户控件 它被用于创建和修改事务类型及其过滤器。

父 UI 元素是 TabItem:

<TabItem Header="TransactionType" x:Name="TransactionTypeEditor_Tab">
    <!-- TransactionTypeEditor -->
    <transActionTypeNamespace:TransactionTypeEditor></transActionTypeNamespace:TransactionTypeEditor>
</TabItem>

TransactionTypeEditor 在代码中有一个参数,这是TransactionTypeEditor.xaml.cs 中某些应用程序逻辑所必需的:

public partial class TransactionTypeEditor : UserControl
{
    public TransactionTypeEditor()
    {
        InitializeComponent();
    }
    string[] AvailableFields;
    /* ... logic ... */
}

如何在 xaml 创建时将此参数 AvailableFields 从其父级传递给 TransactionTypeEditor? 如果我将参数添加到构造函数中,如下所示,我的应用程序将无法编译:

public TransactionTypeEditor(string[] availableFields)
{
    AvailableFields = availableFields
    InitializeComponent();
}

一种解决方案是通过应用程序逻辑将TransactionTypeEditor 添加到其父级,例如:

public parent(string[] availableFields)
{
    InitializeComponent();
    TransactionTypeEditor tEditor = new TransactionTypeEditor(availableFields);
    this.TransactionTypeEditor_Tab.Children.Add(tEditor);
}

此解决方法会导致无法加载 xaml 预览,但会正常运行。

我想我发现了类似的问题,例如以下,但无法从他们的回答中得出任何结论: User Control with Input Parameter

【问题讨论】:

  • 将 AvailableFields 声明为依赖属性并在 XAML 中分配一个绑定。在依赖属性的PropertyChangedCallback中初始化TransactionTypeEditor。

标签: c# wpf user-interface constructor user-controls


【解决方案1】:

借助 Clemens 的建议以及有关依赖属性的 microsoft 文档
https://docs.microsoft.com/en-us/dotnet/desktop/wpf/properties/dependency-properties-overview?view=netdesktop-6.0

还有这个关于绑定的堆栈溢出问题:
WPF Binding to local variable

我想出了这个:

为用户控件添加扩展属性TransactionTypeEditor.xaml.cs

public partial class TransactionTypeEditor : UserControl
{
    // register dep. property
    public static readonly DependencyProperty AvailableFields_Property = 
    DependencyProperty.Register(
        "AvailableFields", typeof(string[]), typeof(TransactionTypeEditor)
    );

    public TransactionTypeEditor()
    {
        InitializeComponent();
    }

    // property
    public string[] AvailableFields
    {
        get => (string[])GetValue(AvailableFields_Property);
        set => SetValue(AvailableFields_Property, value);
    }

    /* ... logic ... */
}

在父级的xaml中,添加带有属性的用户控件:

<TabItem Header="TransactionType" x:Name="TransactionTypeEditor_Tab">
    <!-- TransactionTypeEditor -->
    <transActionTypeNamespace:TransactionTypeEditor AvailableFields="{Binding AvailableFields}"></transActionTypeNamespace:TransactionTypeEditor>
</TabItem>

【讨论】:

  • 您应该将 PropertyMetadata 作为第四个参数传递给 DependencyProperty.Register,以便添加一个 PropertyChangedCallback,您可以通过它对属性的更改做出反应并初始化一个 TransactionTypeEditor 实例。参见例如这个:stackoverflow.com/a/28302378/1136211
猜你喜欢
  • 2013-07-05
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多