如何将对象传入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
相关产品推荐
相关产品推荐

