【问题标题】:DataGrid refresh issue数据网格刷新问题
【发布时间】:2012-02-28 16:25:56
【问题描述】:

我有一个 Silverlight 4 DataGrid,它的 ItemsSource 绑定到一个 ObservableCollection。当我修改 ObservableCollection 的元素时,修改后的元素会正确显示在我的网格内,除了一个 column 的元素。此列与其他列的不同之处在于它是 TemplateColumn 并且它使用 ValueConverter

列的模板由一个简单的 stackPanel 组成,其中包括一个 Path 控件和一个 Label。并且 Label 在简单的 ValueConverter 的帮助下绑定到某个 Source 对象。

现在的问题是,当我修改某个属于 ObservableCollection 的元素时,网格的所有列都正确显示,除了上面描述的那一列。它只是保持不变 - 但是当我使用鼠标光标选择 DataGridCell 并再次单击它时,突然发生所需的刷新。

所以我想这是我在这里缺少的一些简单的东西,但我找不到它......

提前谢谢..

编辑:

与此同时,我能够进一步定位问题:似乎在我修改了 ObservableCollection 的一个元素之后,属于我的网格中绑定到源的标签的相应 ValueConverter 只是不叫。当我在单元格内单击时,ValueConverter 会被调用。但它不会自动 - 那么我该如何实现呢?请帮忙:)

编辑:

绑定:

<sdk:Label Content="{Binding Route.Legs, Converter={StaticResource IncomingTableRouteTripConverter}}" Margin="9,0,0,0" Style="{StaticResource TripLabelTemplate}" FontFamily="Arial" FontSize="10.667" Padding="0" Height="10" FontWeight="Bold" />

这是我的 ValueConverter 的代码: (但我不认为转换器的代码与我的问题有任何关系,我只是为了完整性才在这里发布)

public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {

        string trip = "";

        if (value != null) {


            List<Leg> legs = (List<Leg>)value;

            if (legs.Count >= 1) {

                for (int i = 0; i <= legs.Count - 1; i++) {

                    trip += ((Leg)legs[i]).Start.ICAO + " - " + ((Leg)legs[i]).Stop.ICAO + " - ";
                }

                trip = trip.Substring(0, trip.Length - 2);
            }
        }

        return trip;
    }

【问题讨论】:

    标签: wpf silverlight data-binding datagrid valueconverter


    【解决方案1】:

    Path 通知中的所有节点都需要到位,因此拥有Route 的类和拥有Legs 的类都需要实现INPC

    此外,如果您将项目添加到Legs 列表中,自然不会更新任何内容,事实上,即使Legs 属性的类型为ObservableCollection&lt;...&gt; 也没关系,因为绑定引擎只关心INPC

    因此,如果您希望在集合更改时更新绑定,您需要在每次修改 Legs 属性时触发属性更改(包括完全替换引用)。

    【讨论】:

    • @Marc:您已经有了路径,添加Path= 不会改变任何内容。 (我现在无法查看您添加的代码,可能稍后再查看)
    • @Marc:编辑了我的答案,希望对您有所帮助。
    • @Marc:正如我所说,无论何时更改集合,无论其类型如何,都需要触发PropertyChanged 事件。
    • @Marc:再次澄清一下,“更改集合”我的意思不仅是对 Legs 属性的重新分配,还包括对列表的操作,例如 Legs.Add(...)Legs.Remove(...)。为了轻松做到这一点,您可以使用 ObservableCollection,因为您可以订阅更改并触发事件 (Legs.CollectionChanged += (s,e) =&gt; OnPropertyChanged("Legs");)。
    • @Marc:因为,正如我在之前的回答版本中所解释的那样,网格可能会更改模板,并且当您的模板重新应用时,所有内容都会重新构建,并且绑定会再次解决。 (至少这是一种合理的解释)
    【解决方案2】:

    如果你喜欢使用

    Content="{Binding Path=Parameter Converter={StaticResource SomeConverter}}"

    那么你的问题可能就解决了……

    【讨论】:

    • 哦,你没有提到 路径 所以我认为给家伙正确的代码可以减少他的困惑.. ;)
    • 我的意思是你是否有任何建议给我:) 同时我能够在 datagrid-binding-valueConverter 范围内的某个地方找到问题:) 你没有任何线索- 我真的迷路了:)
    • 这是唯一可以帮助你的东西 Marc 但不知道为什么它不起作用??? :(
    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多