如何使用MVVM从DataGrid获取SelectedItems

时间:2012-02-13 13:21:17

标签: c# wpf collections telerik

我正在使用C#构建WPF应用程序,并且我在我的应用程序中使用了 MVVM架构。                                                                                                我使用 DataTemplate 在telerik gridview中创建了一个 CheckBox列。我正在使用一个集合来绑定GridView中的数据。

如何在该集合中选择 DataItem的特定行号在网格上选中CheckBox时。

这里我在Grid上创建CheckBox的代码是:

<telerik:GridViewDataColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
                                <CheckBox Name="StockCheckBox" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type telerik:GridViewRow}}, Path=IsSelected}" />
                             </StackPanel>
                        </DataTemplate>
                    </telerik:GridViewDataColumn.CellTemplate>

我的收藏是,

   foreach (var AvailableStock in AvailableStocks)// In this **AvailableStocks**(IEnumurable Collection) I got all the datas in the Gridview 
        //In this collection How can i know that the particular RowItem is selected in that gridview by CheckBox
      {
          if (SelectedStock != null)
          {
             this.SelectedStocks.Add(AvailableStock );

             this.RaisePropertyChanged(Member.Of(() => AvailableStocks));
          }
      }

任何人请告诉我一些有关此问题的建议我如何实现这一目标? 如何识别已选择的特定行?

先谢谢。

1 个答案:

答案 0 :(得分:0)

我建议使用MVVM方法并使用Binding来获取所选项目。不幸的是,DataGrid不为所选项提供DependencyProperty,但您可以提供自己的。从DataGrid派生一个类,为SelectedItems注册一个依赖项属性,并覆盖SelectionChanged事件以更新您的依赖项属性。然后,您可以使用Binding将ViewModel通知所选项目。

代码:

public class CustomDataGrid : DataGrid
{
    public static readonly DependencyProperty CustomSelectedItemsProperty = DependencyProperty.Register(
        "CustomSelectedItems", typeof (List<object>), typeof (CustomDataGrid), 
        new PropertyMetadata(new List<object>()));

    public List<object> CustomSelectedItems
    {
        get { return (List<object>) GetValue(CustomSelectedItemsProperty); }
        set { SetValue(CustomSelectedItemsProperty, value);}
    }

    protected override void OnSelectionChanged(SelectionChangedEventArgs e)
    {
        foreach(var item in e.AddedItems)
            CustomSelectedItems.Add(item);
        foreach (var item in e.RemovedItems)
            CustomSelectedItems.Remove(item);
        base.OnSelectionChanged(e);
    }
}

XAML:

<Grid>
    <Ctrl:CustomDataGrid CustomSelectedItems="{Binding MySelectedItems}"/>
</Grid>