longlistselector控件似乎正是我需要的应用程序,因为我有一个很长的列表,我需要显示它,我喜欢它实现的分组功能,但我真的很努力工作的数据绑定方面用它。使用基本数据绑定需要一段时间,但我有完全的功能。如果项目被删除或添加UI正确更新,因为数据源派生自ObservableCollection。
我遇到的问题是我在绑定的各个数据项中有一个标志,表示单个列表项是否应显示或隐藏图形。这个想法是,当用户对某个项目执行保持手势时,它将根据对绑定项目属性的更改来打开或关闭图形。
Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}}
获取组头等的LongListSelector数据绑定要求需要像ObservableCollection<ObservableCollection<MyItem>>
这样的数据源(这看起来很混乱!)。本质上,外部集合是组,内部集合包含显示的项目。我的项目甚至实现了INotifyPropertyChanged接口。我期望的是我的项目属性的更新会自动反映在我的数据绑定中,而不仅仅是从集合中添加或删除项目。
如果我切换属性值没有任何反应,直到我手动刷新需要完全重新加载的绑定。该控件可能不响应各个项目的propertychanged事件。
我需要的是帮助弄清楚在更改了绑定对象的属性后,我可以做些什么来触发单个列表项的更新?
更新
克劳斯,你创建的代码非常有用(对不起,我没有足够的代表来投票给你!)使用该代码我能够显着简化我的代码,并做更多的测试,但它仍然不解决我的问题。我现在确定的是我的装订很好。如果我在简单地绑定到文本字段text="{Binding IsFavorite}"
时更改了属性,它会更新完美。什么似乎不起作用是当我绑定到IValueConverter Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}}"
时它更新相同的属性,它不更新。转换器在初始绑定时工作正常,但在属性更改时无效。为了进一步测试,我将相同的bool属性绑定到文本字段和IValueConverter。当我更改bool值时,文本字段会更新,但不会更新使用转换器绑定的字段。
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>
答案 0 :(得分:2)
我解决了这个问题。问题是我将整个对象传递给IValueConverter而不是在对象内更改的特定属性。我更改了转换器以专门处理bool到Visibility的转换并修复了绑定:
public class BoolToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool boolValue = (bool)value;
return boolValue ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
绑定改变自:
Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}}"
于:
Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}, Path=IsFavorite}"
答案 1 :(得分:0)
您能否在绑定中验证您是否使用OneTime作为绑定模式(而不是OneWay)?
我在绑定到LongListSelector的列表中的项目中使用了数据绑定没有问题 - 我怀疑问题不在于LongListSelector,而是在你的绑定或你的INotifyPropertyChanged ...你可以发布一些代码(理想情况下是绑定,也是绑定的对象。