如何在 C# WPF MVVM 中获取数据网格的多个选定行的值



我对C# MVVM,WPF 很陌生。我有一个 DataGrid,可以在其中选择多行,我想将多行的值作为对象数组获取。 我已经看到了这样的链接,但找不到我想要的确切内容。

enter code here
<DataGrid ScrollViewer.CanContentScroll="True"   VerticalScrollBarVisibility="Auto" SelectionUnit="FullRow"  BorderThickness="1" x:Name="ssa" CanUserAddRows="False" CanUserDeleteRows="False"  AutoGenerateColumns="False"  ItemsSource="{Binding Items,UpdateSourceTrigger=PropertyChanged}"   IsSynchronizedWithCurrentItem="True" GridLinesVisibility="All"   
HorizontalScrollBarVisibility="Auto" SelectionMode="Single" Height="280" Width="1600" SelectedItem="{Binding selected_row}">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="Get item" Command="{Binding get_item}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItems}">
</MenuItem>

<DataGrid.Columns>

<DataGridTextColumn Width="150" x:Name="item_name"  Binding="{Binding name,  Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}">

视图模型.cs 给出了数据网格项的绑定: 私有字符串名称;

public string name
{
get { return Name; }
set { Name = value; RaisePropertyChanged("name"); }
}

enter code here

对于所选项目,还给出了绑定,但我没有得到 如何获取数据网格的多个选定行作为对象数组的值

您可以在附加行为中处理SelectionChanged事件,并在事件处理程序中自行处理源集合的对象。有关如何使用行为绑定到 MVVM 中的只读属性的示例,请参阅此博客文章。

您的行为可以像这样实现:

public class DataGridSelectedItemsBlendBehavior : Behavior<DataGrid>
{
public static readonly DependencyProperty SelectedItemsProperty =
DependencyProperty.Register("SelectedItems", typeof(object),
typeof(DataGridSelectedItemsBlendBehavior ),
new FrameworkPropertyMetadata(null) { BindsTwoWayByDefault = true });
public IList SelectedItems
{
get { return (IList)GetValue(SelectedItemsProperty); }
set { SetValue(SelectedItemsProperty, value); }
}
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.SelectionChanged += OnSelectionChanged;
}
protected override void OnDetaching()
{
base.OnDetaching();
if (this.AssociatedObject != null)
this.AssociatedObject.SelectionChanged -= OnSelectionChanged;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (SelectedItems != null)
{
foreach (var selectedItem in e.AddedItems)
if (!SelectedItems.Contains(selectedItem))
SelectedItems.Add(selectedItem);
foreach (var unselectedItem in e.RemovedItems)
SelectedItems.Remove(unselectedItem);
}
}
}

最新更新