c# - 从代码中选择网格控件中的一行

标签 c# wpf mvvm grid

这个问题在这里已经有了答案:





WPF Datagrid -- programmatic selection of row seems to break multi-select (shift-click multiselect, specifically)

(4 个回答)


11 个月前关闭。




我正在编写一个使用两个网格控件的应用程序。如果用户选择左侧网格控件中的一行,则必须从代码中选择右侧网格控件中的对应行。对于这两个网格,我都使用网格控件派生类,该类允许用户同时选择多行。从代码中选择一行的代码有效,我面临的问题是(显然)其他行没有正确取消选择.之后在右侧网格控件中选择多行时(通过单击一行,然后使用 shift+单击另一行),选择的行比预期的多得多。

public class CustomDataGrid : DataGrid
{
    public CustomDataGrid()
    {
        SelectionChanged += CustomDataGrid_SelectionChanged;
    }

    void CustomDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        SelectedItemsList = SelectedItems;
    }

    #region SelectedItemsList

    public IList SelectedItemsList
    {
        get { return (IList)GetValue(SelectedItemsListProperty); }
        set { SetValue(SelectedItemsListProperty, value); }
    }

    public static readonly DependencyProperty SelectedItemsListProperty =
            DependencyProperty.Register("SelectedItemsList", typeof(IList), typeof(CustomDataGrid), new PropertyMetadata(null));

    #endregion
}

在 xaml 文件中,它是这样使用的:
<vm:CustomDataGrid ItemsSource="{Binding LeftGridItems}" SelectedItemsList="
{Binding SelectedLeftGridItems, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
AutoGenerateColumns="False" SelectionMode="Extended" IsReadOnly="True" 
CanUserAddRows="False" Margin="7,0,7,7" Grid.Row="3" Grid.Column="0">
    <DataGrid.Columns>
        ...

左侧网格中的选择代码:
public IList SelectedLeftGridItems
{
    get { return _selectedLeftGridItems; }
    set
    {
        _selectedLeftGridItems = value;

        // Select the copy on the right side, if available
        if (_selectedLeftGridItems != null && _selectedLeftGridItems.Count > 0)
        {
            Element selected = ((Element)SelectedLeftGridItems[0]);
            if (!string.IsNullOrEmpty(selected.CopyOf))
            {
                SelectedRightGridItems.Clear();
                SelectedRightGridItems.Add(RightGridItems.FirstOrDefault(e => Path.GetFileName(e.Path) == Path.GetFileName(selected.CopyOf)));
                OnPropertyChanged("SelectedRightGridItems");
            }
        }

        OnPropertyChanged("SelectedLeftGridItems");
    }
}

如何确保正确管理正确网格中的选定项目?

最佳答案

在网格中“选择多行”可能是基于 shift-click、ctrl-click、单击的 PITA,它可以取消已经标记的所有其他内容。

我所做的一件事是将复选框控件添加为网格中的第一列,该列绑定(bind)到行源控件上的属性到属性,例如

public bool IsChosen {get; set;}

Sample grid with checkbox

然后,在您的代码中,网格显示的基础行源可以执行...
foreach( var xRow in DataGridRowSource.Where( s => s.IsChosen ))
{
   // find in other grid and similarly mark
}

关于c# - 从代码中选择网格控件中的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61411156/

相关文章:

c# - 如何将 DataContext 绑定(bind)到 XAML 中的通用 ViewModel?

c# - 复杂的树数据结构

c# - 在 C# 中检查 paypal 订阅状态

WPF 相对源行为

c# - DataGrid.ColumnHeaderStyle 和命令绑定(bind)

android - 最佳实践 : Runtime filters with Room and LiveData

c# - 获取连接的 USB 设备列表

c# - MVVM - 如何将 HierarchicalDataTemplate 项的可见性绑定(bind)到 ViewModel 字段

c# - TFS C# - 加载 workItemStore 返回 null 或类型初始值设定项异常

c# - MVVM 和异步数据访问