2013-06-14 1 views
1

wpf (.Net 4.5) DataGrid가 있습니다. MVVM-Light 프레임 워크를 사용하여 응용 프로그램에 MVVM 패턴을 사용하고 있습니다.wpf DataGrid의 SelectedeRow 값에 대한 GUI 업데이트

TrackingCollection이라는 "추적"개체의 관찰 가능한 컬렉션에 바인딩 된 DataGrid가 있습니다. DataGrid selectedItem은 viewModel의 "SelectedTracking"속성에 바인딩됩니다.

<DataGrid Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" MinHeight="300"   
      ItemsSource="{Binding TrackingCollection}"  
      CanUserAddRows="False" CanUserDeleteRows="False" 
      SelectionMode="Single" SelectedItem="{Binding SelectedTracking, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
      RowDetailsTemplate="{StaticResource FTC_TrackingFullDetailTemplate}"> 
</DataGrid> 

하나의 열에 SelectedTracking 개체의 "idAction"속성에 바인딩 된 comboBox가 있습니다. 사용자가이 comboBox의 선택을 변경하면 두 개의 다른 콤보 상자 값을 DataGrid의 다른 두 열에 할당하려고합니다. 이러한 다른 열은 뷰 모델의 속성에 바인딩되지 않고 SelectedTracking 객체의 속성에 직접 바인딩됩니다. SelectedTracking 개체의 이러한 속성은 iSource_Type 및 iDestination_Type입니다. I이 (iSource_Type, iDestination_Type) (제 '액션'으로 comboBox에 따라 selectionChanged 함수 ) 뷰 모델 코드에있는 값을 할당 그래서

<DataGridTemplateColumn Header="SOURCE" SortMemberPath="tracking_source.chrSource" > 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox Style="{StaticResource FTC_DetailComboBox}" Margin="0" Padding="3" 
       ItemsSource="{Binding DataContext.TrackingSources, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" 
       SelectedValuePath="idSource" 
       DisplayMemberPath="chrSource" 
       SelectedValue="{Binding iSource_Type, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"> 
      </ComboBox> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

: 여기

는 iSourceType 대한 열 정의다 값은 객체 자체에서 업데이트됩니다. 그러나 변경 사항은 이러한 속성에 바인딩 된 UI의 콤보 상자에 반영되지 않습니다. 내가 뭘하려

:

첫째 :

나는 RaisePropertyChanged라는 기능에서 INotifyPropertyChanged를 구현해야합니다. 이것은 MVVM_Light 프레임 워크를 통해 제공됩니다. 그래서 나는 다음을 사용하려고 시도했다.

RaisePropertyChanged("iDestination_Type") 
RaisePropertyChanged("iSource_Type") 
RaisePropertyChanged("SelectedTracking") 
RaisePropertyChanged("SelectedTracking.iDestination_Type") 
RaisePropertyChanged("SelectedTracking.iSource_Type") 

그러나 이것들은 작동하지 않는다.

둘째 :

나는 또한 SelectedTracking 객체에 바인드 뷰 모델의 속성을 만들려고. 그러나 이것으로 모든 추적 객체가 동일한 값을 갖게되었습니다.

질문 : 는 뷰 모델의 일부가 아니지만 뷰 모델에있는 객체의 속성입니다 속성에 대한 작업을에서 INotifyPropertyChanged 수 있습니다. 그렇다면 INotifyPropertyChanged 이벤트에서 어떤 구문을 사용해야합니까?

추가 정보 : 에서 INotifyPropertyChanged의 MVVM 라이트 구현 (RaisePropertyChanged()) normaly 모든 UI 요소를 업데이트 할 빈 문자열을 허용하지 않습니다. 그래서 하나의 CLass에서 INotifyPropertyCHanged의 구현을 오버라이드 할 수있는 방법이 있습니까?

답변

2

정확하게 문제를 이해하면 ViewModel에 모델의 변경 사항을 알리는 방법이 필요합니다.

그렇다면 모델에 INotifyPropertyChanged를 구현하고 ViewModel의 모델 객체 PropertyChanged 이벤트에 가입 할 수 있습니다. 여기서 ViewModel 속성에 대한 속성 변경 알림을 발생시킬 수 있습니다.

간단한 예 개념을 설명하기 :

모델 :

public class Tracking : INotifyPropertyChanged 
{ 
    private string _isourcetype; 
    private string _idestinationtype; 

    public string SourceType 
    { 
     get { return _isourcetype; } 
     set 
     { 
      _isourcetype = value; 
      OnPropertyChanged("SourceType"); 
     } 
    } 

    public string DestinationType 
    { 
     get { return _idestinationtype; } 
     set 
     { 
      _idestinationtype = value; 
      OnPropertyChanged("DestinationType"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

뷰 모델 : 내 모델이 이미에서 INotifyPropertyChanged 구현

public class TrackingViewModel : ViewModelBase 
{ 
    private Tracking _selectedTracking; 

    public string DestinationType 
    { 
     get { return _selectedTracking.DestinationType; } 
    } 

    public string SourceType 
    { 
     get { return _selectedTracking.SourceType; } 
    } 

    public Tracking SelectedTracking 
    { 
     get { return _selectedTracking; } 
     set 
     { 
      _selectedTracking = value; 
      RaisePropertyChanged("SelectedTracking"); 
     } 
    } 

    public TrackingViewModel() 
    { 
     _selectedTracking = new Tracking(); 
     _selectedTracking.PropertyChanged += SelectedTracking_PropertyChanged; 
    } 

    void SelectedTracking_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     switch (e.PropertyName) 
     { 
      case "SourceType": 
       RaisePropertyChanged("SourceType"); 
       break; 
      case "DestinationType": 
       RaisePropertyChanged("DestinationType"); 
       break; 
     } 
    } 
} 
+0

덕분에, 나는 계속하고 싶어 UI 업데이트가 내 ViewModel에서 원칙적으로 호출되지 않습니다 (다른 콤보 박스는 데이터 관계 라기보다는 비즈니스 논리입니다.)하지만, 제 모델에 추가 할 수있는 그러한 빠른 수정을 통해이 문제를 해결할 것입니다. –