我想将我的日志写入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?
答案 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可以转发消息,您可以从视图中绑定它/它们。
这会回答你的问题吗?