Caliburn micro autofac - отображение результатов (журнала) в текстовом поле WPF - PullRequest
0 голосов
/ 27 декабря 2011

У меня есть приложение, которое я сейчас изменяю, чтобы использовать caliburn micro.Приложение имеет класс журнала, который связан с текстовым полем формы.Таким образом, все другие классы автоматически регистрируют свои результаты в этом текстовом поле.

Я не могу понять, как я буду преобразовывать это в калибровочный микро.

Старый код с Autofac

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

Реализация:

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

Все предложения приветствуются.

1 Ответ

0 голосов
/ 06 июня 2012

Вероятно, этот код пахнет. Вы смешиваете класс обслуживания и контроль. Лучше сделай что-нибудь подобное. Определите событие в вашем ILogger и тип его аргументов: открытый интерфейс ILogger { event EventHandler NewUsageLogEntry; }

public class LogEventArgs : EventArgs
{
    public LogEventArgs(string aMessage)
    {
        Message = aMessage;
    }

    public string Message { get; private set; }
}

ViewModel:

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.

...