2011-12-26 11 views
0

私は現在caliburn microを使用するように変更しているアプリケーションがあります。 アプリケーションには、フォーム上のテキストボックスにバインドされたログクラスがあります。したがって、他のすべてのクラスは自動的に結果をこのテキストボックスに記録します。Caliburn micro autofac - テキストボックスに結果(ログ)を表示するWPF

私はこれをキャリバーンマイクロに変換する方法を理解できません。 Autofac

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

実装と

旧コード:

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

すべてsugesstionsはウェルカムです。

答えて

0

おそらくこのコードは匂いがします。あなたはサービスクラスとコントロールを混在させます。このようなことをうまくやってください。 ILoggerとその引数にイベントを定義します。 public interface ILogger { event EventHandler NewUsageLogEntry; }

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

    public string Message { get; private set; } 
} 

のViewModel:私はログを表示するために、データグリッドを使用していますが、簡単に文字列であることをLogMessagesを変更することができます私のコードで

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; 
    } 
} 

。その後、このプロパティをTextBox.Textにバインドする必要があります。 ヒント:あなたの財産を直接更新しないでください。プライベートStringBuilderを更新した後、StringBuilder.ToString()の結果をLogMessages文字列プロパティに代入します。

関連する問題