2013-05-17 3 views
0

ViewModel에 내 로그를 작성하여 로그를 사용자에게 공개 할 수 있습니다.ILoggerFacade를 ViewModel로 리디렉션하는 방법은 무엇입니까?

은 우선은 뷰 모델

<TextBox Grid.Row="1" TextWrapping="Wrap" Text="{Binding Logger}" AcceptsReturn="True" IsReadOnly="True" 
       ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto"/> 

private string logger; 

public string Logger 
{ 
    get { return logger; } 
    set 
    { 
     logger = value; 
     this.RaisePropertyChanged("Logger"); 
    } 
} 

그런 다음, 나는 ILoggerFacade를 구현하는 고객 로거 클래스를 작성하는 뷰 모델이다에보기를 결합하고, 부트 스트 래퍼의 CreateLogger 방법을 재정의합니다. 고객 Logger 클래스

public class MainLogger : ILoggerFacade 
{ 
    public void Log(string message, Category category, Priority priority) 
    { 
     string messageToLog = String.Format(System.Globalization.CultureInfo.InvariantCulture, "{1}: {2}. Priority: {3}. Timestamp:{0:u}.", DateTime.Now, category.ToString().ToUpper(System.Globalization.CultureInfo.InvariantCulture), message, priority.ToString()); 
     //////??????////// 
    } 
} 

그리고 무엇을 작성해야에서

protected override ILoggerFacade CreateLogger() 
    { 
     return new MainLogger(); 
    } 

부트 스트 래퍼

에서

???????. ViewModel에 데이터를 게시하고 ViewModel을 직접 가져 오기 위해 Import IEventAggregator를 시도했습니다. 컨테이너가 등록되기 전에 CreatorLogger Method가 호출되기 때문에 작동하지 않습니다. 그렇다면 어떻게하면 ViewModel에 로그를 기록 할 수 있습니까?

+0

쉘에서 텍스트 상자를 직접 표시 하시겠습니까, 아니면 PRISM에서 지역에 등록한보기 안에 표시 하시겠습니까? – Marc

+0

@ 마르크 안쪽 지역. –

답변

1

단순히 로그 메시지 (들)을 저장하고 속성을 노출해야하는 로거 :

공용 인터페이스의 IMainLogger : ILoggerFacade { 목록 메시지 {얻을; } } 기본적으로 로거는 어떻게해야되는거야

public class MainLogger : IMainLogger 
{ 
    public MainLogger() 
    { 
     Messages = new ObservableCollection<string>(); 
    } 

    public ObservableCollection<string> Messages { get; private set; } 

    public void Log(string message, Category category, Priority priority) 
    { 
     string messageToLog = ...; 
     Messages.Add(messageToLog); 
    } 
} 

: 메시지의 로그를 취합니다. 이제 당신은 지역에 주입하는 View에 포함 된 TextBox 안에 표시하고 싶습니까? 그렇게하려면 생성자 종속성 삽입을 통해이 로거를이 지역의보기 모듈에 전달해야합니다. 나는 MEF 함께 일하고, 그래서 유니티와 함께 ​​작업을 수행하는 방법에 대한 너무 잘 모르겠지만, 당신은 코드에서 컨테이너를 구성 할 때 아마, 다음과 같은 :

container.RegisterType<IMainLogger, MainLogger>(new ContainerControlledLifetimeManager()); 
container.RegisterType<ContainingTextBoxModule>(new InjectionConstructor(container.Resolve<IMainLogger>())); 

이 모듈이 소요 노출하는 로거 :

public class ContainingTextBoxModule : IModule 
{  
    public IMainLogger Logger { get; private set; } 

    public ContainingTextBoxModule(IMainLogger logger) 
    { 
     Logger = logger; 
    } 
} 

그런 다음 모듈에 대한 당신의 ViewModel 메시지 (들)을 릴레이 할 수있는 당신이 당신의보기에서/IT에 바인딩 할 수 있습니다.

귀하의 질문에 대한 답변이 있습니까?

+0

감사합니다. MEF도 사용합니다. 나는 MEF에 너무 많이 의존하고있어, 기본적인 것들을 잊어 버렸다. –

+0

시원하고 기쁘다. – Marc

관련 문제