WPF 数据网格绑定工具提示在表格内容绑定刷新时闪烁

Posted

技术标签:

【中文标题】WPF 数据网格绑定工具提示在表格内容绑定刷新时闪烁【英文标题】:WPF Data grid bonded tooltip is blinking by table content binding refresh 【发布时间】:2016-10-20 20:31:59 【问题描述】:

我有一个 WPF 应用程序,它有一个数据网格,其中绑定了一个可观察的集合,表示它的数据。 集合中的数据将应用于单元格的内容和行的工具提示,您可以在以下 xaml 代码中看到:

<DataGrid ItemsSource="Binding ViewModelItems">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Time" Binding="Binding Path=Time" IsReadOnly="True" CanUserSort="False"/>
                        <DataGridTextColumn Header="Color" Binding="Binding Path=Color"  IsReadOnly="True" CanUserSort="False"/>
                    </DataGrid.Columns>
                    <DataGrid.RowStyle>
                        <Style TargetType="DataGridRow">
                            <Setter Property="ToolTip">
                                <Setter.Value>
                                    <TextBlock Text="Binding Path=Notes" />
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </DataGrid.RowStyle>
                </DataGrid>

视图模型当然包含相应的列表:

    public ObservableCollection<Item> ViewModelItems
    
        get  return model.ModelItems; 
    

在模型中:

    private ObservableCollection<Item> _modelItems = new ObservableCollection<Item>();
    public ObservableCollection<Item> ModelItems  get  return _modelItems ;  

Item的类别如下:

public class Item

    public string Time  get; set; 
    public string Color  get; set; 
    public string Notes  get; set; 

问题是这样的:

在模型范围内,我有一个每秒更新 ModelItems 的触发器,因此我可以获得每秒同步的“时间”数据网格字段。

ToolTip 属性后面的“Notes”字段不会改变。当我站在一排看到工具提示时,每次表格刷新其内容时它都会闪烁 - 意味着每隔一秒,toptip 就会消失并返回(尽管“notes”保持不变)

有没有办法避免工具提示闪烁?

我什至尝试不通过 clear/add/remove 来更新 ModelItems,而是直接更新属性“Time”“Color”,并保留“Notes”属性而不触摸它(在这种情况下,我必须实现 ObservableCollection 监听其属性 PropertyChanged 事件并引发 CollectionChanged 事件和 Item 类以在更新相关属性时引发 PropertyChanged 事件) 但它没有帮助。

【问题讨论】:

【参考方案1】:

我认为每次调用 ViewModelItems 的 getter 时都会再次创建 ItemsSource“ViewModelItems”。 试试

private ObservableCollection<Item> viewModelItems;
public ObservableCollection<Item> ViewModelItems

get 
 
if(viewModelItems == null)

viewModelItems = model.ModelItems; 

return viewModelItems;


在 viemodel 上捕捉 modelitems 的属性变化并更新 viewModelItems 中的属性。这应该有助于工具提示闪烁。

【讨论】:

以上是关于WPF 数据网格绑定工具提示在表格内容绑定刷新时闪烁的主要内容,如果未能解决你的问题,请参考以下文章

使用工具提示 WPF 在数据网格中填充组合框

WPF数据绑定,属性值更改UI不刷新其内容[重复]

更新数据源时刷新数据网格

wpf datagrid 怎么增加数据行

在 WPF 中使用数据绑定时,OxyPlot 不刷新

是否可以“刷新”WPF 数据绑定