2014-03-27 51 views
0

我有了綁定到的項目IsSelected屬性複選框一個DataGrid。我試圖創建一個功能,讓您通過點擊/在網格中選擇行拖動或點擊/ shift點擊/ CTRL點擊其他行,然後右擊>選擇設定的我的項目IsSelected屬性。複選框被完美的工作,妥善雙向綁定到我的我的對象IsSelected財產。WPF的DataGrid SelectedItems不取消

我也得到了90%,但是當我送DataGrid的SelectedItems價值,它有時會發送一個選擇,但不再物品。

我發現的代碼從我的視圖模型

private void Select(object selectedObjects) 
{ 
    var items = (System.Collections.IList)selectedObjects; 
    var collection = items.Cast<ItemType>().ToList(); 
    foreach (var item in collection) 
     item.IsSelected = true; 
} 

送DataGrid的SelectedItems到命令here.

<DataGrid ItemsSource="{Binding MyItemList}"> 
    <DataGrid.ContextMenu> 
     <ContextMenu> 
      <MenuItem Header="Select" 
         Command="{Binding Data.SelectCommand, Source={StaticResource BindingProxy}}" 
         CommandParameter="{Binding PlacementTarget.SelectedItems,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" /> 
     </ContextMenu> 
    </DataGrid.ContextMenu> 

C#代碼這是我做的重現。

方案1:

  1. 控制負載,沒有被默認選中
  2. 我點擊和拖動來選擇所有選項
  3. 右擊並選擇Select
  4. 所有複選框現在設置作爲託運,如預期
  5. 點擊第一行所以只有它強調
  6. 右鍵點擊通道上OOSE Deselect
  7. 所有行的複選框被取消(錯了!)

方案2:

  1. 控制負荷,未選中任何
  2. 單擊並拖動,選擇前2項
  3. 權單擊並選擇Select,複選框得到遏制
  4. 取消選中行1和2
  5. 選擇第4行和第5行
  6. 右鍵單擊>Select
  7. 現在檢查第1,2,4和5行。 (錯誤的)
  8. 取消選中1,2,4,和5
  9. 選擇行7和8
  10. 右鍵點擊>Select
  11. 行1,2,7和8,現在被檢查。 (正是這樣)

我很難找出某種一貫的理由,它的行爲是這樣的。我最好的猜測是,當我右鍵點擊數據網格時,它不會像通常的選擇操作那樣工作。任何人有任何線索,爲什麼發生這種情況,或者我怎麼能強迫電網正確選擇行我告訴它?

回答

1

我發現了這個問題。我正在使用包裝類來啓用我的對象上的選擇:Selectable<T>。該對象包含一個IsSelected布爾值和一個T Item。這個類的創建者已經覆蓋了EqualsGetHashCode方法。這導致等號檢查失敗,所以DataGrid沒有正確取消選擇對象,因爲它們被檢測爲不同的項目。

如果您對對象進行適當的Equals檢查,上述問題中的代碼應正常工作。

0

你幾乎在使用MVVM,但你的ViewModel在哪裏?使用ViewModel,這變得很容易。

您有一個Model對象用於您的數據源:AccountJobList 它是一個Model對象的列表,我假設它是AccountJob。

因此,也許AccountJob沒有IsChecked屬性,或者它沒有實現,但它沒有實現INotifyPropertyChanged。這就是我們創建ViewModels的原因。 因此,創建一個AccountJobViewModel,它是AccountJob的包裝。此AccountJobViewModel必須實現INotifyPropertyChanged。現在在ViewModel中添加一個IsChecked屬性。

現在我們創建一個繼承ObservableCollection的AccountJobListViewModel(或者如果您不需要您的集合是Observable,則爲List<AccountJobViewModel>)。 AccountJobListViewModel接受一個AccountJobList並在列表中創建一個AccountJob,它創建一個AccountJobViewModel並將其添加到集合中。

您還需要AccountJobListViewModel或其父項中的SelectedItems的屬性。我假設你的Select/Deselect方法在某種ViewModel中,所以它可能會在那裏。

現在,您只需在ViewModel上綁定IsChecked。

<CheckBox IsChecked="{Binding IsChecked}" /> 

現在在您的代碼中,您只需將每個選定的AccountJobViewModel的IsChecked屬性設置爲true。

private void Select(object selectedObjects) 
{ 
    foreach (AccountJobViewModel item in SelectedItems) 
    item.IsChecked = true; 
} 
+0

對不起,我不是很明確,我試圖簡潔。我有一個viewmodel,上面的C#代碼來自viewmodel。該複選框正確綁定到我的對象的IsSelected屬性,這不是問題。 – DLeh

+0

我想要做的是讓我的viewmodel中的另一個對象綁定到DataGrid的SelectedItems屬性,然後我的Select方法可以簡單地查看該列表,但它不會讓我綁定到SelectedItems屬性。這就是爲什麼我試圖將DataGrid的SelectedItems作爲參數發送到Select命令/方法 – DLeh

+0

我想我意外地在您的答案上點擊了編輯而不是我的問題。對於那個很抱歉。 – DLeh