2014-12-02 7 views
0

내 ShellViewModel에서 Linq 및 EntityFramework를 사용하여 쿼리하는 다음 함수가 있습니다. 여기서 목표는 POCO를 ViewModels로 변환하고 결과 ViewModel을 CM을 사용하여 ShellView의 ListBox에 바인딩하는 것입니다.ViewModels의 Caliburn.Micro EventAggregator가 CM에 의해 인스턴스화되지 않았습니다

다음은 코드의 일부 목록입니다. 모든 것이 잘 작동합니다. 그러나 이제는 특정 작업이 발생할 때 ShellViewModel에 알릴 수 있도록 각 ItemViewModel을 사용해야하는 시점에 있습니다. 어떻게 CM의 EventAggregator를 각 ItemViewModel에 넣을 수 있습니까? 모든 EventAggregator 예제는 ViewModel의 Ctor를 통한 종속성 주입을 통해 이러한 상황을 보여줍니다. 아래의 GetData()와 같이 ViewModel을 인스턴스화 할 때 종속성 주입을 사용하려면 어떻게해야합니까?

[Export(typeof(ShellViewModel))] 
public class ShellViewModel : Conductor<object>, IHandle<UserPasswordChanged> 
{ 
    private void GetData() 
    { 
     var query = _EfDataContext.Items 
      .Where(x => (x.CreatedDtm > DayBeginning && x.CreatedDtm <= NowDtm)); 

     //Create a list of ItemViewModels for Caliburn.Micro to Bind 
     //How can EventAggregator be injected into ItemViewModel when 
     //creating ViewModels this way? 

     this.Items = new BindableCollection<ItemViewModel>(query 
       .Select(x => new ItemViewModel 
       { 
        Item = x 
       })); 
    } 
    [ImportingConstructor] 
    public ShellViewModel(IEventAggregator eventAggregator) 
    { 
      _eventAggregator = eventAggregator; 
      _eventAggregator.Subscribe(this); 
      IsDeveloperMode = false; 

    } 
} 

답변

0

왜 그렇게 EventAggregator를 전달하지 않습니까?

// ... 
.Select(x => new ItemViewModel(_eventAggregator) 
// ... 

이는 종속성이 이미 주입 된 인스턴스에 의해 명시 적으로 작성되기 때문입니다.

+0

덕분에 내가 개체 초기화 구문이 시도 할 때, 나는 다음과 같은 오류 얻을 : "유형의 상수 값을 만들 수 없습니다 '를 Caliburn.Micro.IEventAggregator 이 컨텍스트에서는 원시 유형 또는 열거 유형 만 지원됩니다. " – Sean

+0

흠, 그 오류 메시지를 재현 할 수없는 것 같습니다. 나는 당신 자신의 답변에 게시 된 것처럼 EventAggregator = this._event를 시도했지만 괜찮습니다. EventAggregator는 ItemViewModel의 IEventAggregator의 속성입니까? – Sven

0

내 Linq 선언문에 문제가있는 것으로 나타났습니다. Sven이 언급했듯이 이미 ShellViewModel에서 EventViewModel로 이벤트 수집기를 전달하려고 했었습니다. 왜 다시 주입해야합니까?

Items = 
      new BindableCollection<ItemViewModel>(query 
       .Select(x => new ItemViewModel 
       { 
        Item = x, 
        EventAggregator = this._eventAggregator 
       })); 

그러나 이것은 다음과 같은 오류가 발생합니다 유형의 상수 값 'Caliburn.Micro.IEventAggregator'을 만들 수 없습니다 . 이 문맥에서는, 원시 형 또는 열거 형만이 지원되고 있습니다.

나는 이것이 Mef 나 CM과 문제가 아니라 Linq와 관련이 없다는 것을 깨닫지 못했습니다. 다음 두 단계 솔루션 작동 : 귀하의 제안 스벤위한

Items = 
      new BindableCollection<ItemViewModel>(query 
       .Select(x => new ItemViewModel 
       { 
        Item = x 
       })); 

foreach (var itemViewModel in Items) 
      itemViewModel .EventAggregator = this._eventAggregator; 
+0

문제를 해결하겠습니까? ViewModel 외부에서 EventAggregator를 할당하는 이상한 방법입니다. 공용 ItemViewModel (IEventAggregator eventAggregator) {this.EventAggregator = evenAggregator}과 같이 생성자에서 수행 할 수 있으며 대신 MVVM에서 처리하도록 새 ItemViewModel을 사용하지 않습니다. –

관련 문제