2014-03-27 52 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