【发布时间】:2011-07-18 06:31:46
【问题描述】:
longlistselector 控件似乎正是我的应用程序所需要的,因为我有一个很长的列表需要显示,而且我喜欢它实现的分组功能,但我真的在工作的数据绑定方面苦苦挣扎用它。让基本的数据绑定工作需要一段时间,但我拥有完整的功能。如果删除或添加项目,UI 会正确更新,因为数据源派生自 ObservableCollection。
我遇到的问题是我在绑定到的各个数据项中有一个标志,该标志指示单个列表项是否应该显示或隐藏图形。这个想法是,当用户对某个项目执行按住手势时,它将根据绑定项目属性的更改打开或关闭图形。
Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}}
获取组标头的 LongListSelector 数据绑定要求等需要像 ObservableCollection<ObservableCollection<MyItem>> 这样的数据源(看起来令人困惑!)。本质上,外部集合是组,内部集合包含显示的项目。我的项目甚至实现了 INotifyPropertyChanged 接口。我所期望的是对我的项目属性的更新会自动反映在我的数据绑定中,而不仅仅是从集合中添加或删除项目。
如果我切换属性值,则在我手动刷新需要完全重新加载的绑定之前,什么都不会发生。此控件可能不响应单个项目的 propertychanged 事件。
我需要帮助弄清楚在我更改了绑定对象的属性后,我可以做些什么来触发单个列表项的更新?
更新:
Claus,您创建的代码非常有帮助(抱歉,我还没有足够的代表来投票给您!)使用该代码我能够显着简化我的代码并进行更多测试,但它仍然不能解决我的问题。
我现在确定的是我的绑定没问题。如果我在绑定到文本字段text="{Binding IsFavorite}" 时更改属性,它会完美更新。似乎不起作用的是,当我在绑定到 IValueConverter Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}}" 时更新相同的属性时,它不会更新。转换器在初始绑定时工作正常,但在属性更改时不能正常工作。为了进一步测试,我将相同的 bool 属性绑定到文本字段和 IValueConverter。当我更改布尔值时,文本字段会更新,但不会更新使用转换器绑定的字段。
public class VisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Chemical chem = value as Chemical;
if (chem == null)
return Visibility.Collapsed;
if (chem.IsFavorite)
return Visibility.Visible;
else
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
XAML:
<myNS:ChemicalToFavoriteVisibilityConverter x:Key="isFavoriteToVisibility" />
<Rectangle Grid.Column="0"
Fill="{StaticResource PhoneContrastBackgroundBrush}"
Height="26" Stroke="Black" Width="26"
Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}}">
<Rectangle.OpacityMask>
<ImageBrush ImageSource="/Images/star_big.png"/>
</Rectangle.OpacityMask>
</Rectangle>
<StackPanel Grid.Column="1" Margin="0,0,0,0">
<TextBlock Text="{Binding IsFavorite}"
TextWrapping="Wrap"
Style="{StaticResource PhoneTextLargeStyle}"
Foreground="{StaticResource PhoneForegroundBrush}"/>
</StackPanel>
【问题讨论】:
-
关于 LongListSelector 的数据绑定,您可以使用类似gist.github.com/1089190
-
看起来该实现不是可观察的。你能发布一个代码示例来用一个简单的分组列表填充这个类吗?看起来我可能会传递某种 lambda 或类似的东西。
-
你可以让它实现 ObservableCollection
而不是 List 。实现类似于: GroupedUsers = new LongListCollection (users, u => u.Name[0]); -
@ClausJørgensen:BitBucket 不允许人们在没有帐户的情况下查看该链接。介意在别处发布吗?
标签: windows-phone-7 silverlight-toolkit