首页 > 解决方案 > 选择行时将可编辑的 DataGridCells 切换到编辑模式?

问题描述

我的总体用户交互目标是清晰、直观地告知用户哪些 datagridcell 字段可用于编辑,哪些不可编辑。

下面的样式几乎可以工作(当用户选择行时,DataGridRow 上的 DataGridCells 被 IsSelected 触发),但是如果单元格(例如文本框)绑定到只读属性,则会引发 wpf 异常。也就是说,似乎要设置 IsEditing=True 才能工作,绑定属性需要是可写的。

低级异常是: System.InvalidOperationException: 'A TwoWay 或 OneWayToSource 绑定不能在只读属性上工作...

我希望可以在 MultiTrigger 中检查 DataGridCell 是否绑定到可写属性,但我对数据绑定的理解不够深入。

            <Style TargetType="{x:Type DataGridCell}">

                <Style.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="True"/>
                            <!--<Condition Property="IsFocused" Value="True"/>-->
                        </MultiTrigger.Conditions>
                        <Setter Property="IsEditing" Value="True"/>
                    </MultiTrigger>
``

标签: wpfdatagridwpf-style

解决方案


我认为这可能会让你朝着正确的方向开始。 https://www.wpf-tutorial.com/styles/multi-triggers-multitrigger-multidatatrigger/

您能否详细说明您想用 IsSelected 和 IsEditing 完成什么?我想出了这个示例来向您展示如果相应的绑定对象根据您的既定目标将“ReadOnly”设置为 true,则如何禁用文本框。这将清楚地显示可以编辑哪些单元格。

<DataGrid x:Name="textBoxGrid"
                  ItemsSource="{Binding ItemList}"
                  AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Text}"
                                     IsReadOnly="{Binding ReadOnly}">
                                <TextBox.Style>
                                    <Style TargetType="TextBox">
                                        <Setter Property="IsEnabled"
                                                Value="True" />
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding ReadOnly}"
                                                         Value="true">
                                                <Setter Property="IsEnabled"
                                                        Value="False" />
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </TextBox.Style>
                            </TextBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

推荐阅读