Mvvm 如何将iLogger Facade重定向到ViewModel?

Mvvm 如何将iLogger Facade重定向到ViewModel?,mvvm,prism,Mvvm,Prism,我想将日志写入ViewModel,以便向用户公开日志 首先,我将视图绑定到ViewModel <TextBox Grid.Row="1" TextWrapping="Wrap" Text="{Binding Logger}" AcceptsReturn="True" IsReadOnly="True" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScr

我想将日志写入ViewModel,以便向用户公开日志

首先,我将视图绑定到ViewModel

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

public string Logger
{
    get { return logger; }
    set
    {
        logger = value;
        this.RaisePropertyChanged("Logger");
    }
}
然后,我创建了实现ILoggerFacade的customer logger类,并在Bootstrapper中重写CreateLogger方法

在引导程序中

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());
        //////??????//////
    }
}

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

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

公共接口IMainLogger:iLogger外观 { 列出消息{get;} }

然后,模块的ViewModel可以转发消息,并且可以从视图中绑定到消息


这是否回答了您的问题?

您想直接在shell中显示文本框,还是在您在PRISM中的某个区域注册的视图中显示文本框?谢谢,我也使用MEF。我太依赖MEF了,所以我忘了基本的东西。
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);
    }
}