【问题标题】:Caliburn micro autofac - Showing Results(log) in textbox WPFCaliburn micro autofac - 在文本框 WPF 中显示结果(日志)
【发布时间】:2012-01-28 05:10:54
【问题描述】:

我目前正在修改一个应用程序以使用 caliburn micro。 该应用程序有一个绑定到表单上的文本框的日志类。所以所有其他类都会自动将它们的结果记录到这个文本框。

我不知道如何将其转换为 caliburn micro。

使用 Autofac 的旧代码

builder.Register<ILogger>(h => new Logger(textBoxLog)).SingleInstance();

实施:

public class Logger : ILogger
{
    public Logger(System.Windows.Controls.TextBox textBox)
    {
    }
 }

欢迎所有建议。

【问题讨论】:

    标签: autofac caliburn.micro


    【解决方案1】:

    可能这段代码有异味。您确实混合了服务类和控件。最好做这样的事情。在您的 ILogger 及其参数类型中定义一个事件: 公共接口 ILogger { 事件事件处理程序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 字符串属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多