【问题标题】:How to get value of multiple selected rows of the Datagrid in C# WPF MVVM [duplicate]如何在 C# WPF MVVM 中获取 Datagrid 的多个选定行的值 [重复]
【发布时间】:2020-01-15 12:10:25
【问题描述】:

我对 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

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

【问题讨论】:

标签: c# wpf mvvm


【解决方案1】:

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

你的行为可以这样实现:

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

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 2016-08-11
    • 2017-08-18
    • 1970-01-01
    • 2021-12-02
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多