【问题标题】:WP7 LonglistSelector databinding - How to trigger an update to a bound item's bindingWP7 LonglistSelector 数据绑定 - 如何触发绑定项目绑定的更新
【发布时间】: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


【解决方案1】:

我解决了这个问题。问题是我将整个对象传递给 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}"

【讨论】:

  • 嘿 CactusPCJack,你有没有尝试过改变 ItemTemplate TextBlock 的前景?我正在尝试这样做,但绑定失败...
【解决方案2】:

您能否确认在您的绑定中您没有使用 OneTime 作为绑定模式(而不是 OneWay)?

我在绑定到 LongListSelector 的列表中的项目中使用数据绑定没有问题 - 我怀疑问题不在于 LongListSelector,而是在于您的绑定或您的 INotifyPropertyChanged ...您可以发布一些代码(理想情况下是绑定,还有被绑定的对象)。

【讨论】:

  • 是的,我可以确认它不是 OneTime。它是单向。从集合中删除的项目确实会消失,添加的项目会显示出来,但对属性的更改似乎不会更新它们的绑定。
  • 我尽量简化项目,分享出来,但在这里发帖似乎不太合适。我会尽快发布亮点。
  • 查看我对该问题的更新。看起来初始列表填充工作正常,但是当绑定到 IValueConverter 时,有些东西阻止它看到字段更新。
猜你喜欢
  • 2011-07-25
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 2016-07-02
相关资源
最近更新 更多