如何将ILoggerFacade重定向到ViewModel?

时间:2013-05-17 04:01:39

标签: mvvm prism

我想将我的日志写入ViewModel,因此我可以将日志公开给用户。

首先,我将View绑定到ViewModel

<TextBox Grid.Row="1" TextWrapping="Wrap" Text="{Binding Logger}" AcceptsReturn="True" IsReadOnly="True"
                 ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto"/>

这是ViewModel

private string logger;

public string Logger
{
    get { return logger; }
    set
    {
        logger = value;
        this.RaisePropertyChanged("Logger");
    }
}

然后,我创建了实现ILoggerFacade的客户记录器类,并覆盖Bootstrapper中的CreateLogger方法。

在Bootstrapper中

protected override ILoggerFacade CreateLogger()
    {
        return new MainLogger();
    }

在客户记录器类

public class MainLogger : ILoggerFacade
{
    public void Log(string message, Category category, Priority priority)
    {
        string messageToLog = String.Format(System.Globalization.CultureInfo.InvariantCulture, "{1}: {2}. Priority: {3}. Timestamp:{0:u}.", DateTime.Now, category.ToString().ToUpper(System.Globalization.CultureInfo.InvariantCulture), message, priority.ToString());
        //////??????//////
    }
}

什么应该填写???????。我尝试使用Import IEventAggregator将数据发布到ViewModel,并在此处直接导入ViewModel。两者都不起作用,因为在注册容器之前调用了CreatorLogger方法。那么如何将日志写入ViewModel?

1 个答案:

答案 0 :(得分:1)

记录器应该只保存日志消息并将其公开在属性中:

public interface IMainLogger:ILoggerFacade     {         列出消息{get; }     }

public class MainLogger : IMainLogger
{
    public MainLogger()
    {
        Messages = new ObservableCollection<string>();
    }

    public ObservableCollection<string> Messages { get; private set; }

    public void Log(string message, Category category, Priority priority)
    {
        string messageToLog = ...;
        Messages.Add(messageToLog);
    }
}

这基本上就是记录器应该做的事情:记录消息。现在你想在一个TextBox中显示它,它包含在你注入区域的View中,对吧?要做到这一点,您需要通过构造函数依赖注入将该记录器传递给该区域视图的模块。我正在使用MEF,所以我不太确定如何使用Unity,但是当你在代码中配置容器时,它可能看起来像这样:

container.RegisterType<IMainLogger, MainLogger>(new ContainerControlledLifetimeManager());
container.RegisterType<ContainingTextBoxModule>(new InjectionConstructor(container.Resolve<IMainLogger>()));

模块采用并公开记录器的地方:

public class ContainingTextBoxModule : IModule
{    
    public IMainLogger Logger { get; private set; }

    public ContainingTextBoxModule(IMainLogger logger)
    {
        Logger = logger;
    }
}

然后,模块的ViewModel可以转发消息,您可以从视图中绑定它/它们。

这会回答你的问题吗?