添加新行时,WPF的DataGrid不会更新SelectedItems

时间:2018-03-23 13:14:19

标签: c# wpf datagrid selection rows

在WPF中使用DataGrid时,直接从UI上的DataGrid添加新行时,SelectedItems属性的大小总是在增加 - 即使在UI上总是选择单行进行编辑。

如何克服这个?为什么SelectedItems属性不反映UI上所选项目的实际数量?

我的代码:

SampleWindow.xaml

<Window x:Class="ALMClient.Controls.SampleWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:ALMClient.Controls"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="0.9*"/>
        <RowDefinition Height="0.1*"/>
    </Grid.RowDefinitions>
    <TabControl Name="tabControl" Grid.Row="0">
        <TabItem Header="Test">
            <DataGrid Name="dataGrid" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" CanUserAddRows="True" CanUserDeleteRows="True" AutoGenerateColumns="True" 
                      ItemsSource="{Binding GeneralTasks}" SelectionMode="Single" SelectionChanged="dataGrid_SelectionChanged" SelectionUnit="FullRow">

            </DataGrid>
        </TabItem>
    </TabControl>
    <TextBox Name="selectionBox" Grid.Row="1">

    </TextBox>
</Grid>

SampleWindow.xaml.cs

using System.Windows;

namespace ALMClient.Controls
{
    public partial class SampleWindow : Window
    {
        public SampleWindow()
        {
            InitializeComponent();
        }        

        private void dataGrid_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            this.selectionBox.Text = this.dataGrid.SelectedItems.Count.ToString();
        }
    }
}

1 个答案:

答案 0 :(得分:-1)

您将选择模式设置为单个

ItemsSource="{Binding GeneralTasks}" **SelectionMode="Single"** 

这意味着选择项目有点学术性。 您应该使用SelectedItem属性。

由于您正在绑定项目资源,因此您似乎很奇怪,您没有使用mvvm方法并将selecteditem绑定到viewmodel中的属性。 然后,您可以将代码放入该绑定属性的setter中,并在调用它时执行,而不是使用selectionchange事件。 像这样: https://social.technet.microsoft.com/wiki/contents/articles/30564.wpf-uneventful-mvvm.aspx#Select_From_List_IndexChanged

我用来测试这个的东西是我有很多不同的样式和东西来演示和探索问题。它充满了垃圾和注释掉的位。

重要的是datagrid和handler。 我有

<TabControl Name="tabControl" Grid.Row="0">
    <TabItem Header="Test">
        <DataGrid ItemsSource="{Binding Items}" 
          RowHeight="30"
         x:Name="dg"
         Height="300" 
         SelectionUnit="FullRow"
         AutoGenerateColumns="true"
         Sorting="dg_Sorting"
         HeadersVisibility="All"
         SelectionMode="Extended"
         CanUserDeleteRows="true"
         CanUserAddRows="True"
         AlternationCount="2000"
         AutoGeneratingColumn="dg_AutoGeneratingColumn_1"
         SelectionChanged="dg_SelectionChanged"
           >

我尝试使用selectionmode single和extended,绑定到observablecollection和数据表的视图。 它总能奏效。

我的经纪人。

private void dg_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    this.countSelected.Text = dg.SelectedItems.Count.ToString();
}

这是压缩解决方案: https://1drv.ms/u/s!AmPvL3r385QhgooXOPWbZYGwuScJMQ