You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF DataGrid中基于ComboBox选择切换控件的异常问题

问题分析与解决方案

问题1:初始加载“Movie Hall”列空白

原因:ContentControl未设置默认的ContentTemplate,仅在触发器中定义了模板,初始状态无触发条件时控件无内容显示。

问题2:切换“Movie Source”后“Movie Hall”列未即时更新

原因:

  • 第一个DataTrigger使用ElementName=cbMovieSource绑定,但DataGrid每个单元格控件处于独立命名作用域,跨单元格无法通过ElementName找到目标控件,绑定失效。
  • 未确保数据项的MovieSourceSelected属性实现INotifyPropertyChanged接口,属性变更无法及时通知UI刷新。

修改后的完整实现

1. 确保数据项实现INotifyPropertyChanged

你的数据实体类需要实现该接口,示例代码:

public class MovieItem : INotifyPropertyChanged
{
    private string _movieSourceSelected;
    public string MovieSourceSelected
    {
        get => _movieSourceSelected;
        set
        {
            _movieSourceSelected = value;
            OnPropertyChanged();
        }
    }

    // 其他属性(MovieSources、MovieHalls、MovieHallsSelected、TextA等)需同理实现属性变更通知

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

2. 修正“Movie Hall”列的XAML代码

<DataGridTemplateColumn Header="Movie Hall" Width="*">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ContentControl>
                <!-- 设置默认模板:初始显示ComboBox -->
                <ContentControl.ContentTemplate>
                    <DataTemplate>
                        <ComboBox x:Name="cbMovieHall" Width="120" 
                                  ItemsSource="{Binding MovieHalls, Mode=TwoWay}" 
                                  SelectedItem="{Binding MovieHallsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                    </DataTemplate>
                </ContentControl.ContentTemplate>
                
                <ContentControl.Style>
                    <Style TargetType="ContentControl">
                        <Style.Triggers>
                            <!-- 选中"Manual Entry"时切换为TextBox模板 -->
                            <DataTrigger Binding="{Binding MovieSourceSelected}" Value="Manual Entry">
                                <Setter Property="ContentTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBox Width="120" 
                                                     Text="{Binding TextA, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

关键修改说明

  • 给ContentControl设置默认ContentTemplate,初始加载直接显示ComboBox,解决空白问题。
  • 移除无效的ElementName绑定,直接绑定数据项的MovieSourceSelected属性,确保属性变更时UI即时响应。
  • 简化TextBox绑定路径:DataContext已指向当前行数据项,无需通过RelativeSource查找DataGridRow(若TextA确实在父ViewModel中,可保留原绑定,但通常数据项应包含该属性)。

内容的提问来源于stack exchange,提问作者Strange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:52:52