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

如何在其他类中向VM_Main的Errors集合添加错误信息?

问题与解决方案

问题背景

我开发的程序包含网络功能,为避免网络异常时弹出大量消息框,采用ObservableCollection<string>来统一展示错误信息。

ViewModel代码:

internal class VM_Main
{   ...
    public ObservableCollection<string> Errors { get; } = new ObservableCollection<string>();
    ...
}

XAML窗口绑定展示代码:

public MainWindow()
{    ...
    vm_Main = new VM_Main();
    dgdErrors.ItemsSource = vm_Main.Errors;
    ...
}

上述部分运行正常,但在其他类(如Customer)中捕获异常时,无法直接访问VM中的Errors集合,报错提示“Errors doesn't exist in the current context”,示例代码如下:

internal class VM_Main
{   ...
    public ObservableCollection<string> Errors { get; } = new ObservableCollection<string>();
    ...
    List<Customer> allCustomers = new List<Customer>();
}

public class Customer
{   ...
    public string Name { get; set; }
    ...
    public Customer()
    {
        try{ // 网络操作 }
        catch (Exception ex) {   // 无法调用 Errors.Add(ex.Message) }
    }
    ...
}

解决方法

方法1:构造函数注入错误集合

直接将VM中的Errors集合通过构造函数传递给Customer类,让Customer具备访问权限。

修改Customer类:

public class Customer
{
    private readonly ObservableCollection<string> _errors;

    // 构造函数接收错误集合
    public Customer(ObservableCollection<string> errors)
    {
        _errors = errors;
        try
        {
            // 网络操作代码
        }
        catch (Exception ex)
        {
            _errors.Add($"Customer初始化失败: {ex.Message}");
        }
    }
}

VM中创建Customer对象时传入Errors:

internal class VM_Main
{
    public ObservableCollection<string> Errors { get; } = new ObservableCollection<string>();
    List<Customer> allCustomers = new List<Customer>();

    // 示例:加载Customer的方法
    public void LoadCustomers()
    {
        var customer = new Customer(Errors);
        allCustomers.Add(customer);
    }
}

方法2:通过事件传递错误

如果不想让Customer直接依赖ObservableCollection,可以通过事件机制通知VM添加错误。

修改Customer类,定义错误事件:

public class Customer
{
    // 定义错误事件
    public event EventHandler<string> ErrorOccurred;

    public Customer()
    {
        try
        {
            // 网络操作代码
        }
        catch (Exception ex)
        {
            // 触发事件,传递错误信息
            ErrorOccurred?.Invoke(this, $"Customer初始化失败: {ex.Message}");
        }
    }
}

VM中创建Customer时订阅事件:

internal class VM_Main
{
    public ObservableCollection<string> Errors { get; } = new ObservableCollection<string>();
    List<Customer> allCustomers = new List<Customer>();

    public void LoadCustomers()
    {
        var customer = new Customer();
        // 订阅错误事件,收到后添加到Errors集合
        customer.ErrorOccurred += (sender, errorMsg) => Errors.Add(errorMsg);
        allCustomers.Add(customer);
    }
}

方法3:全局错误服务(适用于复杂项目)

如果项目中有多个类需要上报错误,可以封装一个独立的错误服务,解耦各个类的依赖。

首先定义错误服务接口与实现:

// 错误服务接口
public interface IErrorService
{
    void AddError(string message);
}

// 错误服务实现
public class ErrorService : IErrorService
{
    private readonly ObservableCollection<string> _errors;

    public ErrorService(ObservableCollection<string> errors)
    {
        _errors = errors;
    }

    public void AddError(string message)
    {
        _errors.Add(message);
    }
}

VM中初始化服务:

internal class VM_Main
{
    public ObservableCollection<string> Errors { get; } = new ObservableCollection<string>();
    private readonly IErrorService _errorService;
    List<Customer> allCustomers = new List<Customer>();

    public VM_Main()
    {
        _errorService = new ErrorService(Errors);
    }

    public void LoadCustomers()
    {
        var customer = new Customer(_errorService);
        allCustomers.Add(customer);
    }
}

修改Customer类依赖错误服务:

public class Customer
{
    private readonly IErrorService _errorService;

    public Customer(IErrorService errorService)
    {
        _errorService = errorService;
        try
        {
            // 网络操作代码
        }
        catch (Exception ex)
        {
            _errorService.AddError($"Customer初始化失败: {ex.Message}");
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:21:58