WPF DataGridComboBoxColumn TextBinding 不更新

WPF DataGridComboBoxColumn TextBinding not updating

我正在尝试使用 DataGridComboBoxColumn,但在显示与所选项目关联的文本时遇到了问题。从技术上讲,我使用的是扩展 DataGridComboBoxColumn 的 MaterialDataGridComboBoxColumn(参见该代码 here. 唯一真正的区别似乎是添加了 ItemSourceBinding,这使得绑定到非静态列表更容易。)

这是xaml中的组合框:

<materialDesign:MaterialDataGridComboBoxColumn 
    Header="Meter" 
    ElementStyle="{StaticResource CenterEverything}" 
    ItemsSourceBinding="{Binding PotentialMeters}"
    DisplayMemberPath="Name" 
    TextBinding="{Binding Segment.Meter.Name, Mode=OneWay}" 
    SelectedItemBinding="{Binding Segment.Meter, UpdateSourceTrigger=PropertyChanged}" />

DataGrid 的项目源由包含 SegmentWrappers 的 ObservableCollection 构成:

public sealed class SegmentWrapper : INotifyPropertyChanged {
        public Segment Segment { get; set; }

        public List<Meter> PotentialMeters => GetPotentialMeters();

        public event PropertyChangedEventHandler PropertyChanged;

        private List<Meter> GetPotentialMeters() => Segment.Station.AllMeters;

    }

Segment 对象是我的实际模型:

public sealed class Segment :  INotifyPropertyChanged {

        public Station Station { get; set; }

        public Meter Meter { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;
}

现在,奇怪的是当我 运行 处于调试状态时有时我可以让它工作。通常,当我启动时,我无法在 ComboBox 中看到所选 Meter 的名称,但是如果我从上面的 xaml 中删除并重新添加 TextBinding 属性,而代码为 运行,则名称显示正确!我想这与 UpdateSourceTrigger 有关,但我无法弄清楚。有什么想法吗?

在您的段属性的 setter 中,通知 属性 反映在 UI

我现在有一个解决方法(所以也许这不应该被认为是一个答案?我是 SO 的新手,所以我很乐意 post 如果它不应该是一个答案,我会很乐意将其作为评论).

我切换到 DataGridTemplateColumn 并且基本上对所有内容使用相同的绑定并且它有效。我将原来的 xaml 更改为:

 <DataGridTemplateColumn  Header="Meter" Width="Auto" IsReadOnly="True">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox   Style="{StaticResource MaterialDesignDataGridComboBox}" 
                            Foreground="{DynamicResource MaterialDesignBody}"
                            ItemsSource="{Binding PotentialMeters, Mode=OneWay}" 
                            DisplayMemberPath="Name"
                            Text="{Binding Segment.Meter.Name, Mode=OneWay}" 
                            SelectedItem="{Binding Segment.Meter}">
                </ComboBox>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>

对于为什么原来的方法不起作用,我没有真正的答案,但我对此很满意。