2012-05-29 77 views
0

我有一個數據網格的ItemsSource對象的ObservableCollection(OC)。當一個項目的屬性發生變化時,我想在OC上工作。鼓起來WPF Datagrid項目事件

E.g.我有一個項目被批准上傳到我們的數據庫。但是,我需要通過OC循環檢查集合中是否存在已符合設置條件的其他項目,以便我實際上不必上載所選項目。

在datagrid上,當我勾選項目的複選框時,它將更改項目的布爾值(例如「IsToUpload」),並且應該觸發屬性更改的事件。

我假設我需要將我的事件通知'冒泡'給datagrid/mainwindow類,然後我可以在OC上工作。我該怎麼做,如果這不是正確的方法,我該怎麼做?

我已經按照阿蘭穆赫蘭的階級結構動態顏色我行: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)。

非MVVM

在你的DataGrid你會與一些標識標籤的複選框,然後使用ButtonBase.Click =「」在數據網格級別事件會爲任何click事件處理冒泡任何按鈕(例如按鈕,菜單項,切換按鈕,複選框,單選框,組合框),它們在數據網格的整個可視化樹中被點擊。

在處理程序中,驗證e.OriginalSource是否爲複選框,其Tag與我們在數據網格的XAML中設置的標識值是否相同。這樣我們就知道CheckBox被點擊了。

E.g.

 <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

的唯一方法MVVM可以是通過使用Command執行作爲底層NotificationObject通知祖先對象在視覺被選中(調用setter時),我們執行提供給所述命令NotificationObject

爲此,使用基於RelayCommandDelegateCommand弱引用(如在互聯網上公佈)。

添加新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); 
     } 
    } 
} 

使用通知對象

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基於行爲的RoutedCommand '

讓我知道這是否有幫助...

+0

謝謝你的全面解答。我使用了非MVVM示例,並對它進行了調整,以便在確認它是單擊的複選框時,我直接修改了ItemObjectViewModel,而不是通過NotificationObject。 – MHTri