如何在C#WPF MVVM中获取Datagrid的多个选定行的值
我对C#MVVM、WPF还是个新手。我有一个DataGrid,在其中我可以选择多行,我想获得多行作为对象数组的值。 我已经看到了这样的链接,但无法找到我想要的确切内容如何在C#WPF MVVM中获取Datagrid的多个选定行的值,c#,wpf,mvvm,C#,Wpf,Mvvm,我对C#MVVM、WPF还是个新手。我有一个DataGrid,在其中我可以选择多行,我想获得多行作为对象数组的值。 我已经看到了这样的链接,但无法找到我想要的确切内容 enter code here <DataGrid ScrollViewer.CanContentScroll="True" VerticalScrollBarVisibility="Auto" SelectionUnit="FullRow" BorderThickness="1" x:Name="ssa" CanUs
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>
在此处输入代码
对于选定项,也提供了绑定,但我不知道如何将多个选定的数据网格行作为对象数组来获取值您可以在附加的行为中处理
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);
}
}
}
公共类DataGridSelectedEditEmsBlendBehavior:Behavior
{
公共静态只读从属属性SelectedItemsProperty=
DependencyProperty.Register(“SelectedItems”,类型为(对象),
类型(DataGridSelectedItemsBlendBehavior),
新的FrameworkPropertyMetadata(null){BindsTwoWayByDefault=true});
公共IList SelectedItems
{
获取{return(IList)GetValue(SelectedItemsProperty);}
set{SetValue(selecteditemsprroperty,value);}
}
受保护的覆盖无效附加()
{
base.onatached();
this.AssociatedObject.SelectionChanged+=OnSelectionChanged;
}
附加时受保护的覆盖无效()
{
base.OnDetaching();
if(this.AssociatedObject!=null)
this.AssociatedObject.SelectionChanged-=OnSelectionChanged;
}
SelectionChanged上的私有无效(对象发送方,SelectionChangedEventArgs e)
{
如果(SelectedItems!=null)
{
foreach(e.AddedItems中的变量selectedItem)
如果(!SelectedItems.Contains(selectedItem))
SelectedItems.Add(selectedItem);
foreach(e.RemovedItems中的var unselectedItem)
选择编辑项。删除(取消选择编辑项);
}
}
}
bindSelectedItems
到一个可观察对象collection@BizhanSelectedItems没有公共设置器。无法约束。这是否回答了您的问题?
public string name
{
get { return Name; }
set { Name = value; RaisePropertyChanged("name"); }
}
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);
}
}
}