You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将对象传入WPF UserControl?求简洁实现方案

简洁实现方案:构造函数注入

既然目标对象(Addon.Example)在控件生命周期内完全不变,构造函数注入是最符合面向对象思想的简洁实现,直接在控件初始化时传入实例并持有,无需冗余的依赖属性或复杂绑定逻辑。

1. 定义Addon类(含静态实例)

public class Addon
{
    // 全局静态实例
    public static Addon Example { get; } = new Addon 
    { 
        Name = "示例插件", 
        Version = "1.0.0" 
    };

    // 需要展示的业务属性
    public string Name { get; set; }
    public string Version { get; set; }
}

2. 实现AddonControl用户控件

通过构造函数接收Addon实例,保存为只读成员,初始化时直接绑定UI:

public partial class AddonControl : UserControl
{
    // 只读成员,生命周期内固定
    private readonly Addon _boundAddon;

    // 构造函数注入依赖
    public AddonControl(Addon addon)
    {
        InitializeComponent();
        _boundAddon = addon ?? throw new ArgumentNullException(nameof(addon));
        LoadAddonInfoToUI();
    }

    // 将属性值同步到UI元素
    private void LoadAddonInfoToUI()
    {
        // 假设控件内有两个TextBlock,x:Name分别为txtAddonName、txtAddonVersion
        txtAddonName.Text = _boundAddon.Name;
        txtAddonVersion.Text = _boundAddon.Version;
    }
}

3. 在外部使用控件

直接传入静态实例即可,无需额外配置:

// 在窗口/页面的代码逻辑中创建控件
var addonDisplayControl = new AddonControl(Addon.Example);
// 添加到容器(如Grid、StackPanel)
yourContainer.Children.Add(addonDisplayControl);

可选:XAML中直接使用(标记扩展方式)

如果需要在XAML中声明控件,可通过自定义标记扩展直接返回静态实例,避免代码后置:

自定义标记扩展

public class StaticAddonExtension : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return Addon.Example;
    }
}

XAML中引用

<Window xmlns:local="clr-namespace:YourProjectNamespace">
    <!-- 直接通过标记扩展传入静态实例 -->
    <local:AddonControl DataContext="{local:StaticAddonExtension}" />
</Window>

控件XAML绑定

此时可直接在AddonControl的XAML中绑定属性,无需后台代码同步:

<UserControl x:Class="YourProjectNamespace.AddonControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel Margin="10">
        <TextBlock Text="插件名称:" />
        <TextBlock Text="{Binding Name}" FontSize="14" FontWeight="Bold" />
        <TextBlock Text="版本:" Margin="0,10,0,0" />
        <TextBlock Text="{Binding Version}" FontSize="12" />
    </StackPanel>
</UserControl>

内容的提问来源于stack exchange,提问作者Christopher Trent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:35:04