在视图模型

时间:2015-07-27 19:51:33

标签: c# .net logging mvvm log4net

在我的程序中记录某些内容之后,我将Logging信息存储在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()
    {       
    }

不会抛出任何错误,但我的视图模型中没有显示任何内容。

如何在视图模型中显示日志记录信息?

1 个答案:

答案 0 :(得分:0)

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

看起来您正在尝试在LoggerView.xaml中使用ViewModelLocator。由于您将构造函数放入参数,因此需要解决它。您有两个选择:

  1. 如果您使用来自MVVM灯的IoC,如SimpleIoC,请首先注册CustomLogger。 SimpleIoc.Default.Register<CustomLogger>();
  2. 在代码中创建LoggerViewModel,然后手动将DataContext分配给LoggerView LoggerViewModel vm = new LoggerViewModel(new CustomLogger()); this.loggerView.DataContext = vm;
  3. 我希望这会有所帮助。

    =============================================== ==========================
    关于解决方案1的更多细节。 如果您决定使用SimpleIoC,那么:

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

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

    2. LoggerViewModel构造函数应该有带有CustomLogger参数的构造函数,IoC将采用这个。

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

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

        1. 在LoggerView.xaml中,您应该将我们的View的DataContext设置为ViewModelLocator并使用路径LoggerViewModel为
        2. < UserControls .... DataContext="{Binding Source={StaticResource Locator}, Path=LoggerViewModel}">