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>
对于为什么原来的方法不起作用,我没有真正的答案,但我对此很满意。
我正在尝试使用 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>
对于为什么原来的方法不起作用,我没有真正的答案,但我对此很满意。