XAML DataGrid 中的 WPF 项选择

XAML WPF item selection in DataGrid

我正在调试我作为实习生工作的公司的一位前员工编写的代码。

原来是 DataGrid 没有选择项目。每次我尝试访问 DataGrid.SelectedItem 它 returns 我 null,即使选择了一行。

As you can see in this print

遵循 XAML 代码:

<DataGrid x:Name="SchedulesDataGrid"
                                  Grid.Row="1"
                                  Margin="0 10 0 0"
                                  AlternatingRowBackground="LightSteelBlue"
                                  CanUserReorderColumns="False"
                                  CanUserSortColumns="False"
                                  CanUserResizeColumns="False"
                                  CanUserAddRows="False"
                                  CanUserResizeRows="False"
                                  SelectionMode="Single"
                                  SelectionUnit="CellOrRowHeader"
                                  AutoGenerateColumns="False"
                                  IsSynchronizedWithCurrentItem="True"                                 
                                  ItemsSource="{Binding AssemblySchedules, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="Name"
                                                    Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                                    IsReadOnly="False"
                                                    Width="200">
                                    <DataGridTextColumn.ElementStyle>
                                        <Style TargetType="{x:Type TextBlock}">
                                            <Setter Property="HorizontalAlignment" Value="Left"/>
                                        </Style>
                                    </DataGridTextColumn.ElementStyle>
                                </DataGridTextColumn>

                                <DataGridTemplateColumn Header="Type"
                                                        Width="150">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <ComboBox ItemsSource="{Binding ScheduleType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                                      SelectedItem="{Binding SelectedScheduleType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                                      x:Name="ScheduleTypeComboBox"
                                                      IsSynchronizedWithCurrentItem="True"/>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>

                                <DataGridTemplateColumn Header="Category"
                                                        Width="150">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <ComboBox ItemsSource="{Binding Categories, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                                      SelectedItem="{Binding SelectedCategory, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                                      x:Name="ScheduleCategoryComboBox"
                                                      IsSynchronizedWithCurrentItem="True"
                                                      DisplayMemberPath="Name"/>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>

                                <DataGridTemplateColumn Header="View template"
                                                        Width="250">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <ComboBox ItemsSource="{Binding ScheduleTemplates, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                                      SelectedItem="{Binding SelectedScheduleTemplate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                                      x:Name="ScheduleTemplateComboBox"
                                                      IsSynchronizedWithCurrentItem="True"
                                                      DisplayMemberPath="Name"/>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>

                                <DataGridTemplateColumn Header="Phase"
                                                        Width="150">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <ComboBox ItemsSource="{Binding Phases, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                                      SelectedItem="{Binding SelectedPhase, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                                      x:Name="SchedulePhase"
                                                      IsSynchronizedWithCurrentItem="True"
                                                      DisplayMemberPath="Name"/>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>
                            </DataGrid.Columns>
                        </DataGrid>

我是不是漏掉了什么?

我在互联网上读到 PropertyChanged 绑定是必要的,但我相信它已经以正确的方式完成。

DataGrid print screen

会不会是因为我必须点击行中的名称,所以 SelectedItem 没有被“触发”?

这是我初始化数据网格的方式

        <DataGrid MaxHeight="450" 
                  CanUserAddRows="False" 
                  CanUserDeleteRows="False" 
                  CanUserReorderColumns="False" 
                  VerticalScrollBarVisibility="Auto" 
                  HorizontalScrollBarVisibility="Auto"
                  ItemsSource="{Binding Results}" 
                  SelectedItem="{Binding SelectedResult}">

然后在 ViewModel 中我有这个

    private Data selectedResult;

    public Data SelectedResult
    {
        get { return selectedResult; }
        set
        {
            if (selectedResult != value)
            {
                selectedResult = value;
                RaisePropertyChanged(nameof(SelectedResult));
            }
        }
    }

Data 作为 DataGrid 列的模型

好吧,基本上我不得不改变一些东西。

不知道为什么以及如何我的数据网格的选择部分停止工作。所以我为其创建了另一列,并为数据网格的每一行添加了一个删除按钮。

获取我在按钮 On_Click 方法中使用的行 (sender as Button).DataContext 并将其从数据网格源列表中删除。