2012-05-29 5 views
0

ObservableCollection (OC) 객체의 ItemsSource 인 DataGrid가 있습니다. 항목의 속성이 변경되면 OC 자체에서 작업하고 싶습니다.WPF Datagrid 항목 이벤트 버블 링

예. 데이터베이스에 업로드 할 수 있도록 승인 된 항목이 있습니다. 그러나 OC를 반복하여 컬렉션에 이미 설정된 조건에 맞는 다른 항목이 있는지 확인해야 실제로 선택한 항목을 업로드 할 필요가 없습니다.

데이터 격자에서 항목의 체크 박스를 선택하면 해당 항목의 부울 값 (예 : "IsToUpload")이 변경되며 속성 변경시 이벤트가 트리거됩니다.

나는 그때 내가 OC에서 작업 할 수있는 DataGrid/mainwindow 클래스에 내 이벤트 알림을 버블 링해야한다고 가정합니다. 나는 이것을 어떻게 할 수 있으며 이것이 올바른 방법이 아니라면 무엇을해야합니까?

동적으로 내 행 색상을 아란 멀홀랜드의 클래스 구조를 따랐습니다 : Coloring WPF DataGridRows one by one

그래서 내 클래스 구조는 대략 다음과대로 :

MainWindow -> DataGrid 
    -> ObservableCollection<ItemObjectViewModel:NotificationObject> 

ItemObject : INotifyPropertyChanged //this class is where I 
    //store my item variables. It is referenced through properties 
    //in the ItemObjectViewModel. 

답변

0

이벤트 bubling \ 라우팅 등이에 종속 개체에 대한 작업 시각적 \ 논리 트리. 귀하의 NotificationObject은 종속성 개체가 아니며 시각적 트리에서 호스팅되지도 않습니다. 우리가 시각적 트리에서 가지고있는 것은 체크 박스 (귀하의 NotificationObject에 묶여 있음)입니다. 당신은 당신이 = "ButtonBase.Click을 신분증으로 체크 박스를 태그 한 후 사용해야 데이터 그리드에서"모든 클릭 이벤트에 대한 처리됩니다 데이터 그리드 레벨에서 이벤트가 어떤 버튼 버블

비 MVVM (button, menuitems, togglebuttons, checkboxes, radioboxes, comboboxes와 같은) 데이터 항목의 전체 시각적 트리에서 클릭을 가져옵니다.

핸들러에서 e.OriginalSource이 체크 박스이고 해당 Tag이 DataGrid의 XAML에 설정 한 식별 값과 동일한 지 확인합니다. 그렇게하면 CheckBox가 클릭되었음을 알 수 있습니다.

예 :

 <DataGrid AutogenerateColumns="False" 
        ItemsSource="{Binding NotificationObjectCollection}" 
        ButtonBase.Clicked="OnNotificationCheckBoxClicked"> 
      <DataGrid.Columns> 
       <DataGridCheckBoxColumn Binding="{Binding IsClicked}" 
             Header="Click?"> 
        <DataGridCheckBoxColumn.ElementStyle> 
         <Style TargetType="{x:Type CheckBox}"> 
          <Setter Property="Tag" Value="IsClickCheckBox" /> 
         </Style>       
        </DataGridCheckBoxColumn.ElementStyle> 
       </DataGridCheckBoxColumn> 
      </DataGrid.Columns> 
     </DataGrid> 


    private void OnNotificationCheckBoxClicked 
      (object sender, RoutedEventArgs e) 
    { 
     if (e.OriginalSource is CheckBox) 
     { 
       if (((CheckBox)e.OriginalSource).Tag == "IsClickCheckBox") 
       { 
        var notificationObject 
         = ((CheckBox)e.OriginalSource).DataContext 
          as NotificationObject; 

        if (notificationObject.IsClicked) { } 
        else { } 
       } 
     } 
    } 

MVVM 인 기본 NotificationObjectCommand 실행을 사용하여 시각적으로 상위 객체를 통지 할 수있는 유일한 방법 MVVM은 (세터가 호출) 우리는 공급 된 명령을 실행 체크 얻는다

NotificationObject.

는이 목적을 위해 (인터넷에서 사용할 수 등) RelayCommand 또는 DelegateCommand을 기반으로 약한 참조를 사용합니다.

public class ItemObjectViewModel 
{ 
     private DelegateCommand<NotificationObject> 
      _notificationObjectClickedCommand 
       = new DelegateCommand<NotificationObject>(
        OnNotificationObjectCommandExecute); 

     .... 

     private void PopulateCollection() 
     { 
      NotificationObjectCollection 
      = new ObservableCollection<NotificationObject>(); 
      NotificationObjectCollection.Add(
       new NotificationObject(_notificationObjectClickedCommand)); 
     } 

     private void OnNotificationObjectCommandExecute(
     NotificationObject notificationObject) 
     { 
      if (notificationObject.IsClicked) { } 
      else { } 
     } 
} 

또한 '를 사용하여 비 MVVM 시나리오에서 ICommand를 기반으로 동작을 달성 할 수있는 알림 개체를 사용하여 새로운 NotificationObject 생성자

private ICommand _isClickedCommand; 
public NotificationObject(ICommand isClickedCommand) 
{ 
    _isClickedCommand = isClickedCommand; 
} 


private bool _isClicked; 
public bool IsClicked 
{ 
    get 
    { 
     return _isClicked; 
    } 
    set 
    { 
     if (_isClicked != value) 
     { 
      _isClicked = value; 
      OnPropertyChanged("IsClicked"); 
      isClickedCommand.Execute(this); 
     } 
    } 
} 

추가 RoutedCommand '

도움이 필요하시면 알려주세요 ...

+0

종합적인 답변을 주셔서 감사합니다. MVMS가 아닌 예를 사용하고이를 수정하여 클릭 한 확인란이라는 것을 확인한 후에 NotificationObject를 거치지 않고 직접 ItemObjectViewModel을 수정했습니다. – MHTri