WPF DataGrid单元格Expander聚焦展开失焦收缩失效问题排查
首先,咱们来拆解一下你的问题:Expander能在单元格获得焦点时展开,但失去焦点时不收缩,核心问题出在绑定配置的细节上,还有XAML里的一个小笔误。
1. 先修正XAML的拼写错误
你写的</DataGirdTemplateColumn.CellTemplate>里多了个r,应该是</DataGridTemplateColumn.CellTemplate>——这个笔误会导致XAML解析异常,虽然可能不是收缩失效的直接原因,但先把它改了再说。
2. 移除多余的UpdateSourceTrigger配置
你在绑定里加了UpdateSourceTrigger=LostFocus,但这个属性只对TwoWay或OneWayToSource绑定生效,你的绑定是OneWay(源→目标),这个设置完全没用,反而可能干扰绑定的更新逻辑。删掉它之后,绑定会在源属性(DataGridCell的IsFocused)变化时自动更新目标(Expander的IsExpanded)。
修改后的绑定代码:
<Expander VerticalAlignment="Stretch" IsExpanded="{Binding Path=IsFocused, Mode=OneWay, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridCell}}"> <!-- Expander.Content --> </Expander>
3. 如果还是不收缩,改用DataTrigger方案
如果上面的修改后仍然没效果,大概率是直接绑定的响应不够稳定(比如Expander手动操作后绑定的优先级问题),这时候用DataTrigger来实现会更可靠:
<DataGridTemplateColumn.CellTemplate> <DataTemplate> <Expander VerticalAlignment="Stretch"> <Expander.Style> <Style TargetType="Expander"> <!-- 默认收缩状态 --> <Setter Property="IsExpanded" Value="False"/> <!-- 单元格获得焦点时展开 --> <Style.Triggers> <DataTrigger Binding="{Binding Path=IsFocused, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridCell}}" Value="True"> <Setter Property="IsExpanded" Value="True"/> </DataTrigger> </Style.Triggers> </Style> </Expander.Style> <!-- 这里放你的Expander.Content内容 --> </Expander> </DataTemplate> </DataGridTemplateColumn.CellTemplate>
这种方式通过触发器监听单元格的焦点状态,一旦IsFocused变为false,Expander会自动回到默认的收缩状态,比直接绑定更稳定,也能避免手动操作Expander导致的绑定覆盖问题。
补充说明
你的DataGrid配置SelectionMode="Single"和SelectionUnit="Cell"是完全没问题的,这两个设置不会影响单元格的焦点状态,所以不是问题根源。
内容的提问来源于stack exchange,提问作者Felix D.

