从代码中选择网格控件中的某一行

问题描述 投票:0回答:1

我正在编写一个使用两个网格控件的应用程序。如果用户在左边网格控件中选择了一行,那么右边网格控件中的相应行必须从代码中选择。对于这两个网格,我使用了一个允许用户同时选择多行的网格控件派生类。从代码中选择一行的代码是有效的,我面临的问题是(显然)其他行没有被正确地取消选择。当在右边的网格控件中选择多行后(通过点击一行,然后使用shift+click选择另一行),被选择的行比预期的多很多。

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

我如何确保右边网格中的选择项被正确管理?

c# wpf mvvm grid
1个回答
0
投票

在一个网格中进行 "选择多行 "可能是一个PITA,基于shift-click,ctrl-click,单击可能会取消所有其他已经标记的东西。

我做过的一件事是在网格中添加一个复选框控件作为第一列,它与行源控件上的一个属性绑定,如

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
}
© www.soinside.com 2019 - 2024. All rights reserved.