2010-06-30 20 views
1

저는 CashFlowView, CashFlowViewModel, CashFlowModel의 세 클래스만으로 간단한 MVVM을 만들었습니다.MVVM에서 ObjectDataProvider가 필요하지 않습니까?

나는 역동적 인 9.1 XamDataPresenter (또는 xamDataGrid)를 사용합니다. 내 뷰 모델 내부

<igDP:XamDataPresenter Name="xamDataPresenter1" DataSource="{Binding Source={StaticResource CashFlowData}}"> 

    <ObjectDataProvider x:Key="CashFlowData" ObjectType="{x:Type ViewModel:CashflowViewModel}" MethodName="GetCashFlows" /> 

: 뷰 모델이가보기에 연결되어

public ObservableCollection<CashflowModel> GetCashFlows() 
     { 
      return new ObservableCollection<CashflowModel>() { ... }; 
     } 

:

만큼 내가 ObjectDataProvider 그것의 완벽 실행 벌금을 그리드 연결로
this.DataContext = new CashflowViewModel(); 

. 하지만 대신 ViewModel 내의 속성에 연결할 수 있으면 좋겠다.

<igDP:XamDataGrid DataSource="{Binding Path=ViewModelCollection}"/> 

그러나이 경우에는 내가 그리드 안에 내 행을 대표하는 또 다른 뷰 모델의 컬렉션에 바인딩해야 할 것 같다 : Infragistics의 내가 할 일은에 따르면

이있다. 그리고 내가 혼란스러워하는 곳.

나는이 시도하고 작업 나던 : 뷰 모델 내부

<igDP:XamDataPresenter Name="xamDataPresenter1" DataSource="{Binding Path=CashFlows}"> 

:

public ObservableCollection<CashflowDataGridViewModel> CashFlows 
     { 
      get 
      { 
       return new ObservableCollection<CashflowDataGridViewModel>(); 
      } 
     } 

을하지만 어떻게 난 내 두 번째 뷰 모델 (CashflowDataGridViewModel)를 만들려면 어떻게해야합니까?

나는이 두 번째 뷰 모델 내에서이하게 proprty을 추가하는 시도 :

public CashflowModel CashFlow 
     { 
      get 
      { 
       return new CashflowModel() {...}; 
      } 
     } 

를하지만 내보기에 표시 얻을 모두 실제 cashflowModel 클래스의 기본 헤더의 어떤없이 "현금 흐름"열 헤더입니다.

답변

1

뷰를 ViewModel의 속성에 바인딩하려면 DataContext를 ViewModel의 인스턴스로 설정해야합니다. 내가 일반적으로 할 것은 코드 숨김 나의보기에의 생성자에 다음 줄을 포함하는 것입니다 : 당신이 다른 ViewModels를 사용하는 컨트롤의 다른 그룹을 원한다면 당신은 또한 컨테이너 DataContext를 설정할 수 있습니다

this.DataContext = new SomeAwesomeViewModel(); 

(예 : , Grid.DataContext, StackPanel.DataContext 등).

일단 DataContext가 설정되면 해당 ViewModel의 속성에 바인딩 할 수 있어야합니다.

업데이트

여기에 샘플 코드의 비트가 당신이 가야합니다.

public class CashFlowViewModel 
{ 
    public ObservableCollection<FlowViewModel> DataGridData 
    { 
     get... 
    } 
} 

DataGrid의 데이터를 제공해야하는 속성입니다. 이제, FlowViewModel 클래스가 어떻게 생겼는지를 보겠습니다.

public class FlowViewModel 
{ 
    decimal flowAmount; 
    public decimal FlowAmount 
    { 
     get { return flowAmount; } 
     set 
     { 
      if(flowAmount == value) 
       return; 

      flowAmount = value; 
      NotifyPropertyChanged("FlowAmount"); 
     } 
    } 
    . 
    . 
    . 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     if(PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

안녕하세요, Eric 님, 이미 다음과 같이 연결되어 있습니다.DataContext = new CashflowViewModel(); 두 번째 ViewModel (CashflowDataGridViewModel) 안에 하나의 속성이 있는데 그 속성을 볼 수 있습니다. 그러나 각 행에 대한 CashflowModel의 실제 내용은 아닙니다. 어쩌면 내가 이것을 분명히하기 위해 스크린 샷이 필요합니다 ... – Houman

+0

방금 ​​질문을 다시 읽고, 나는 당신이 무엇을 요구하는지 알고 있다고 생각합니다. CashFlowViewModel에서 ObservableCollection 을 노출해야합니다. 여기서 FlowViewModel은 DataGrid의 한 행에 포함될 데이터를 나타 냅니까? 그 맞습니까? 그렇다면 FlowViewModel을 만드는 것이 매우 간단해야합니다. INotifyPropertyChanged 인터페이스를 구현하는 새 클래스를 만듭니다. 행의 각 항목에 대한 속성을 만들고 변경 내용이 PropertyChanged 이벤트를 트리거하는지 확인하십시오. –

+0

감사합니다! :) 지금은 이해. 모델 자체에 알림을 추가하기를 원합니다. 하지만 INotifyPropertyChanged와 같은 인터페이스를 사용하여 모델을 다룰 것이므로 실수라고 생각합니다. 따라서 모델을 래핑하고 거기에 INotifyPropertyChanged 기능을 추가하는 두 번째 ViewModel을 갖는 것이 좋습니다. 내 가정이 맞습니까? – Houman

관련 문제