我有一个应用程序,我目前正在修改使用caliburn micro。 该应用程序具有一个绑定到窗体上的文本框的日志类。因此,所有其他类会自动将其结果记录到此文本框中。
我无法弄清楚我将如何将其转换为caliburn micro。
使用Autofac的旧代码
builder.Register<ILogger>(h => new Logger(textBoxLog)).SingleInstance();
实现:
public class Logger : ILogger
{
public Logger(System.Windows.Controls.TextBox textBox)
{
}
}
所有的sugesstions都很好。
答案 0 :(得分:0)
可能这段代码闻起来。您确实混合了服务类和控件。更好地做这样的事情。在ILogger中定义一个事件及其参数类型: 公共接口ILogger { event EventHandler NewUsageLogEntry; }
public class LogEventArgs : EventArgs
{
public LogEventArgs(string aMessage)
{
Message = aMessage;
}
public string Message { get; private set; }
}
视图模型:
public class LogModeViewModel : ModeViewModel
{
public LogModeViewModel(ILogger aLogger)
{
if (aLogger == null)
{
throw new ArgumentNullException("aLogger", "Логгер не задан.");
}
Logger = aLogger;
Logger.NewUsageLogEntry += OnNewUsageLogEntry;
}
public ObservableCollection<ApplicationUsageLogEntry> LogMessages
{
get
{
if (mLogMessages == null)
{
mLogMessages = new ObservableCollection<ApplicationUsageLogEntry>();
}
return mLogMessages;
}
}
private ILogger Logger { get; set; }
private void OnNewUsageLogEntry(object aSender, LogEventArgs aEventArgs)
{
ApplicationUsageLogEntry lLogEntry = new ApplicationUsageLogEntry(aEventArgs.Message);
LogMessages.Add(lLogEntry);
}
private ObservableCollection<ApplicationUsageLogEntry> mLogMessages;
}
public class ApplicationUsageLogEntry
{
public ApplicationUsageLogEntry(string aMessage)
{
if (string.IsNullOrWhiteSpace(aMessage))
{
throw new ArgumentNullException("aMessage", "Сообщение не задано.");
}
Message = aMessage;
HappenOn = DateTime.Now;
}
public string Message { get; private set; }
public DateTime HappenOn { get; private set; }
public override string ToString()
{
string lResult = string.Format("{0:dd.MM.yyyy hh:mm:ss} | {1}", HappenOn, Message);
return lResult;
}
}
在我的代码中,我使用DataGrid显示日志,但您可以轻松地将LogMessages修改为字符串。之后,您需要将此属性绑定到TextBox.Text。 提示:不直接更新您的财产。更新私有StringBuilder,然后将StringBuilder.ToString()的结果分配给LogMessages字符串属性。