c# - 如何在 C# WPF MVVM 中获取 Datagrid 的多个选定行的值
问题描述
我对 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}}">
数据网格项的 Viewmodel.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);
}
}
}
推荐阅读
- python - 当我在 Pytorch 中应用 nn 模型时,损失不会减少
- reactjs - 我从 API 收到文件 URL 作为响应。当用户单击下载按钮时,应下载文件而不在新选项卡中打开文件预览
- shopify - 如何在不使用循环的情况下将多个图像添加到 Shopify 部分?
- pickle - Cassandra Reaper JMX_AUTH 错误,使用 cassandra 作为后端存储时?
- xamarin - Xamarin Google Maps 自定义消息弹出窗口
- maven - Makefile 运行 Maven 命令,但命令有“:”字符
- google-cloud-platform - 在 GCP 中创建 IAM 成员会引发错误 The size of the policy is too large
- react-native - 原生基础 FloatingLabel 焦点样式
- python - 如何使用 Python 更改或清除 Jira 中分辨率字段的值?
- wordpress - 无法导入磁盘空间不足。无法将内容写入文件。文件:/opt/bitnami/apps/wordpress/htdocs/wp-content/uploads 错误