我对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);
}
}
}