Caliburn micro autofac - 在文本框WPF中显示结果(日志)

时间:2011-12-26 23:15:06

标签: autofac caliburn.micro

我有一个应用程序,我目前正在修改使用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都很好。

1 个答案:

答案 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字符串属性。