我有一个Silverlight 4 DataGrid ,其 ItemsSource 绑定到 ObservableCollection 。当我修改 ObservableCollection 的元素时,修改后的元素会在我的网格中正确显示,但列的元素除外。此列与 TemplateColumn 的列不同,它使用的是 ValueConverter 。
该列的模板由一个包含Path控件和Label的简单stackPanel组成。并且借助于简单的ValueConverter将Label绑定到某个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;
}
答案 0 :(得分:2)
对于Path
通知中的所有节点都需要到位,因此拥有Route
的类和拥有Legs
的类都需要实现INPC
。
此外,如果您将项目添加到Legs
列表,则自然不会更新任何内容,实际上即使Legs
属性类型为ObservableCollection<...>
,也不会仅作为绑定引擎关心INPC
。
因此,如果您希望在集合发生更改时更新绑定,则每次以某种方式修改Legs
属性时都需要触发属性更改(包括完全替换引用)。
答案 1 :(得分:0)
如果您使用
Content =“{Binding Path = Parameter Converter = {StaticResource SomeConverter}}”
然后你的问题可能会解决......