【发布时间】:2020-09-05 00:24:42
【问题描述】:
我有一个带有 DataGrid 的 WPF 应用程序。 此 DataGrid 绑定到包含一堆模型的 ObservableCollection。 此 DataGrid 的选择模式设置为 Extended。
如果当前选择了一个项目,然后收到更新(例如,在刷新期间所选项目的某些内容发生了变化),然后用户尝试选择另一个项目,它不会取消选择前一个项目。
OnselectionChanged 触发,但不包含先前的项目,似乎没有办法取消选择它。
运行此代码的代码(使用 .net core 3.1 清理 wpf 应用程序)
DataGrid,(如您所见)也不存储任何选定的项目。
<DataGrid Grid.Row="1"
x:Name="ItemsDataGrid"
SelectionMode="Extended"
ItemsSource="{Binding Items}">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<Trigger Property="DataGridCell.IsSelected" Value="True">
<Setter Property="Background" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
</DataGrid>
项目,这是一个简单的 Observable 集合
private ObservableCollection<Window> _items = new ObservableCollection<Window>();
public ObservableCollection<Window> Items
{
get => _items;
set => SetProperty(ref _items, value);
}
而改变项目的代码,它只是抓取第一个项目,并添加一个新的维度
private void ChangeItem()
{
var rand = new Random();
Items[0].Dimensions = new Rect(rand.Next(1, 100), rand.Next(1, 100), rand.Next(1, 100), rand.Next(1, 100));
}
根据要求,这里是将项目添加到 ListBox 的代码
private void Button_Click(object sender, RoutedEventArgs e)
{
SelectedItemsListBox.Items.Clear();
foreach(var item in ItemsDataGrid.SelectedItems)
{
SelectedItemsListBox.Items.Add(item);
}
SelectedItemsListBox.Items.Refresh();
}
这里第一个项目已被选中,“更改项目”按钮已被单击以修改维度,还请注意该项目现在如何在下面显示它的描述,这是一个显示所有当前选定项目并被刷新的列表框(单击“显示选定项目”后,包括一个 listbox.clear)。
此处已单击第 3 个项目,将其选中,并且应该反过来取消选择先前选择的项目,但如列表框所示,它仍处于选中状态。
我已经将问题解决到这一点,它最终不是我的选择方法,不是我使用的 MultiSelector,我没有使用任何 UI 框架,这个准系统解决方案仍然存在让我陷入困境的问题说不出话来,不知道它可能是什么。
【问题讨论】:
-
DataGrid似乎表现正常。显示太多项目的是ListBox。由于ListBox也可以正常工作(除非您更改了它的行为),所以它必须是将所选项目添加到ItemsSource的逻辑。有趣的是,特别是您知道不起作用的选择部分被完全忽略并且没有显示在您的帖子中。 -
更新了帖子以包含列表框更新,话虽如此,你看这里是一个测试应用程序,我在实际应用程序中挣扎了 2 多天后创建。无论我如何填充列表框,选定的项目都保持选中状态,将项目绑定到属性也是如此,我存储了 MultiSelector 并检查了它的集合,它仍然存在并且在那里也很好。听了 OnSelectionChanged 也没有显示对旧项目的任何更改
-
为什么叫
SelectedItemsDataGrid,不就是ListBox吗?从您的图像中,只有一个项目被选中,因为只有一个红色行。这就是您处理收藏品的方式。 -
又更新了代码,改了名字。它仍然被称为 DataGrid,因为我只是复制了一些 xaml 并在名称前面添加了选定的内容。它实际上指向 DataGrid 下方显示的列表框
-
您能否建议我应该如何威胁收藏,正如我提到的那样。绑定 OnSelectionChanged docs.microsoft.com/en-us/dotnet/api/… 永远不会因为取消选择顶部项目而触发。使用 Multiselector 将其绑定到 ObservableCollection 也永远不会随着所述项目的移除而更新。循环遍历 DataGrid 本身的所有 SelectedItems(这是一个 100% 的 .net 项目,未经我的修改)仍然将该项目显示为选定项目。如上所示,无论视觉表示是什么