【问题标题】:DataGrid row selection won't trigger property changedDataGrid 行选择不会触发属性更改
【发布时间】:2014-04-30 14:56:04
【问题描述】:

我有一个数据网格,当我选择一行时,绑定到所选项目的属性被正确调用,但如果我再次单击同一行(取消选择它),则不会调用属性更改。 知道为什么吗? ItemsSource 对象实现 INotifyPropertyChaqnged 并且 VM 中的属性是标准的,正如我所说的那样,当我取消选择一行时它不起作用。 这是我的 XAML:

<DataGrid
     CanUserAddRows="False"
     CanUserDeleteRows="False"
     CanUserReorderColumns="False"
     GridLinesVisibility="None"
     ItemsSource="{Binding AllChannelsRecordingSchedule,UpdateSourceTrigger=PropertyChanged}"
     SelectedItem="{Binding SelectedChannelRecordingServer,UpdateSourceTrigger=PropertyChanged}"
     AlternatingRowBackground="{StaticResource VigilantDataGridAlternatingRowColor}"
     ColumnHeaderStyle="{StaticResource VigilantDataGridColumnHeader}"
     RowBackground="White"
     RowHeaderWidth="0"
     AutoGenerateColumns="False"
     FontFamily="Arial"
     FontSize="14"
     MaxWidth="805"
     Height="350"
     Background="White">
     <DataGrid.Resources>
          <Style TargetType="DataGridCell">
               <Setter Property="BorderThickness" Value="0"/>
               <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
          </Style>
     </DataGrid.Resources>
          <DataGrid.RowStyle>
              <Style TargetType="{x:Type DataGridRow}">
                  <Style.Triggers>
                       <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="Background" Value="Transparent" />
                               <Setter Property="Foreground" Value="#000" />
                             </Trigger>
                             <Trigger Property="IsSelected" Value="true">
                                <Setter Property="Background" Value="Blue" />
                                <Setter Property="Foreground" Value="#000" />
                               </Trigger>
                            </Style.Triggers>
                        </Style>
                    </DataGrid.RowStyle>
                    <DataGrid.Columns>
                        <DataGridTextColumn
                            Header="{x:Static p:Resources.SystemRecordingSchedule_ServerName}"
                            Width="*"
                            IsReadOnly="True"
                            Binding="{Binding ServerName,UpdateSourceTrigger=PropertyChanged}">
                            <DataGridTextColumn.ElementStyle>
                                <Style TargetType="{x:Type TextBlock}">
                                    <Setter Property="HorizontalAlignment" Value="Center" />
                                    <Setter Property="VerticalAlignment" Value="Center" />
                                </Style>
                            </DataGridTextColumn.ElementStyle>
                        </DataGridTextColumn>

                        <DataGridTextColumn
                            Header="{x:Static p:Resources.SystemRecordingSchedule_ServerIP}"
                            MinWidth="120"
                            IsReadOnly="True"
                            Binding="{Binding ServerIP,UpdateSourceTrigger=PropertyChanged}">
                            <DataGridTextColumn.ElementStyle>
                                <Style TargetType="{x:Type TextBlock}">
                                    <Setter Property="HorizontalAlignment" Value="Center" />
                                    <Setter Property="VerticalAlignment" Value="Center" />
                                </Style>
                            </DataGridTextColumn.ElementStyle>
                        </DataGridTextColumn>

                        <DataGridTextColumn
                            Header="{x:Static p:Resources.SystemRecordingSchedule_ChannelName}"
                            MinWidth="150"
                            IsReadOnly="True"
                            Binding="{Binding ChannelName,UpdateSourceTrigger=PropertyChanged}">
                            <DataGridTextColumn.ElementStyle>
                                <Style TargetType="{x:Type TextBlock}">
                                    <Setter Property="HorizontalAlignment" Value="Center" />
                                    <Setter Property="VerticalAlignment" Value="Center" />
                                </Style>
                            </DataGridTextColumn.ElementStyle>
                        </DataGridTextColumn>

                        <DataGridTemplateColumn
                            Header="00:00       06:00       12:00       18:00       24:00"
                            MinWidth="350"
                            IsReadOnly="True">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <userControls:SchedulerControl
                                        FullRecordingSchedule="{Binding FullRecordingSchedule,UpdateSourceTrigger=PropertyChanged}"
                                        IsEnabled="False"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                    </DataGrid.Columns>
                </DataGrid>

谢谢

【问题讨论】:

    标签: wpf datagrid selecteditem propertychanged


    【解决方案1】:

    首先修复代码示例格式
    没有人想向右看

    您认为第二次点击取消选择的假设无效

    属性是SelectedItem(不是SelectedUnselectedItem)

    第二次点击只是重新选择,并且由于它已经被选中,所以 UI 不会触发任何内容

    即使您有一个选择更改事件,它也不会在第二次选择时触发。

    如果你想要选择/取消选择的东西,你可以使用 CheckBox 列

    【讨论】:

    • 我确切地知道 SelectedItem 是如何工作的,如果您查看 DataGrid 触发器,您会看到当项目 IsSelected 属性设置为 true 时,它​​会将行的背景颜色为蓝色,并且该触发器有效。在我看来,DataGrid 的 SelectedItem 属性和 DataGridRow 的 IsSelected 属性没有同步。
    • 您的问题和评论并不表明您知道 SelectedItems 的工作原理。
    • 显然你没有答案,此外还有一些事件被触发并导致行背景发生变化。
    • 所以颜色变了?从那你假设第二次点击应该取消选择,即使它没有取消选择,这不是记录的行为。坚实的逻辑。
    • 我是在评论中说的还是你想读的?我只是写了“某些事件被触发并导致行背景发生变化”......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多