【问题标题】:Displaying Logging Information in View Model在视图模型中显示日志信息
【发布时间】:2015-07-27 19:51:32
【问题描述】:

在我的程序中记录某些内容后,我将记录信息存储在 CustomLogger 类中名为 LogItems 的公共字段中。

编辑:我的 CustomLogger 类现在实现了 IMyLogger

public class CustomLogger : IMyLogger
{

// LogItems are stored in this field. Assume that it is not Null.
public ObservableCollection<LogItem> LogItems = new ObservableCollection<LogItem>

public CustomLogger()
{
}

// Other methods that populate the LogItems field

}

IMyLogger 如下:

public interface IMyLogger : ILoggerFacade
{
    ObservableCollection<LogItem> LogItems { get; set; }
}

编辑:谁能告诉我如何从 CustomLogger 类中检索 LogItems 对象?我需要 LogItems 才能在我的 viewModel 中显示它。我的 ViewModel 类如下:

[Export]
[PartCreationPolicy(System.ComponentModel.Composition.CreationPolicy.Shared)]
public class LoggerViewModel : ViewModelBase
{
    public ObservableCollection<LogItem> LogItems { get; set; }
    protected static readonly ILog log = LogManager.GetLogger(typeof(LoggerViewModel));

    [ImportingConstructor]
    public LoggerViewModel(CustomLogger cLogger)
    {
    // Can anyone tell me why I cannot call LogItems from cLogger here? An activation error is being thrown here.
        LogItems = cLogger.LogItems;
    }
}

运行代码后,我在尝试获取 LoggerView 类型的实例时出现激活错误,键为“”。

如果我将 LoggerViewModel 构造函数更改为

    public LoggerViewModel()
    {       
    }

没有引发错误,但我的视图模型中没有显示任何内容。

如何在我的视图模型中显示日志信息?

【问题讨论】:

  • 我没有使用 IOC。如果我把类型改成接口,ILoggerFacade,那我就无法访问CustomLogger类中的LogItems了,对吧?
  • 您好,使用 IoC 很方便,您应该考虑使用它。您可以将类型更改为接口,您将拥有访问权限。它可以看起来: publc interface ILoggerFacade { ObservableCollection LogItems {get;set;} }
  • @Jarek,您能否进一步详细说明“将类型更改为接口”的含义? ILoggerFacade 接口来自 Microsoft Prism 库,因此无法修改。
  • 接口 IMyLogger : ILoggerFacade { ObservableCollection LogItems {get;set;} }
  • 我的CustomLogger应该实现IMyLogger接口吗?

标签: c# .net logging mvvm log4net


【解决方案1】:

如何创建 LoggerViewModel?您使用任何 IoC 框架还是您自己创建实例?

您似乎正在尝试在 LoggerView.xaml 中使用 ViewModelLocator。由于您向构造函数添加了参数,因此您需要解析它。你有两个选择:

  1. 如果你在 MVVM light 中使用像 SimpleIoC 这样的 IoC,首先像这样注册 CustomLogger。 SimpleIoc.Default.Register&lt;CustomLogger&gt;();
  2. 在代码中创建您的 LoggerViewModel,然后手动将 DataContext 分配给 LoggerView。
    LoggerViewModel vm = new LoggerViewModel(new CustomLogger()); this.loggerView.DataContext = vm;

我希望这会有所帮助。

================================================ ===========================
有关解决方案 1 的更多详细信息。 如果您决定使用 SimpleIoC,那么:

  1. 您需要在 ViewModelLocator 的构造函数中注册您的 CustomLogger 和 LoggerViewModel

    SimpleIoc.Default.Register< CustomLogger>(); SimpleIoc.Default.Register< LoggerViewModel>();

LoggerViewModel 构造函数应该有带有 CustomLogger 参数的构造函数,IoC 会接受这个。

  1. 在 ViewModelLocator 中你应该公开一个属性

    public LoggerViewModel LoggerViewModel { get { return ServiceLocator.Current.GetInstance< LoggerViewModel>(); } }

    1. 在 LoggerView.xaml 中,您应该将 View 的 DataContext 设置为 ViewModelLocator,路径为 LoggerViewModel

    < UserControls .... DataContext="{Binding Source={StaticResource Locator}, Path=LoggerViewModel}">

【讨论】:

  • 我自己创建了实例。我会在哪里写 LoggerViewModel vm = new LoggerViewModel(new CustomLogger()); this.loggerView.DataContext = vm;在 CustomLogger 中还是在 LoggerViewModel 中?
  • 您好,您不应该在 ViewModel 中这样做 - ViewModel 不能直接引用 View。我会将此代码放在初始化方法中的 LoggerView.xaml 中。 this.DataContext = new LoggerViewModel(new CustomLogger());
  • 如果我选择使用前一个选项,是否在 LoggerView 构造函数中注册 CustomLogger?我需要在构造函数中删除参数 LoggerViewModel 吗?
  • 非常不清楚。您指的是以前的哪个选项?
  • 我指的是 1. 如果你从 MVVM light 使用 SimpleIoC 之类的 IoC,首先像这样注册 CustomLogger。 SimpleIoc.Default.Register();
猜你喜欢
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多