WP7 LonglistSelector - привязка данных - как вызвать обновление привязки связанного элемента - PullRequest
1 голос
/ 18 июля 2011

Элемент управления longlistselector, по-видимому, как раз то, что мне нужно для моего приложения, поскольку у меня есть очень длинный список, который мне нужно отобразить, и мне нравятся реализуемые им функции группировки, но я действительно борюсь с аспектом работы с привязкой данныхс этим.Потребовалось время, чтобы заставить работать базовую привязку данных, но у меня она полностью функциональна.Если элемент удален или добавлен, пользовательский интерфейс обновляется должным образом, потому что источник данных является производным от ObservableCollection.

Проблема, с которой я сталкиваюсь, состоит в том, что у меня есть флаг в отдельных элементах данных, к которым я привязываю, который указывает, должен ли отдельный элемент списка отображать или скрывать графику.Идея состоит в том, что когда пользователь выполняет жест удержания для элемента, он включает или выключает графику на основе изменений свойств связанного элемента.

    Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}}

Требования привязки данных LongListSelector для получения заголовков группы итакой требует источник данных, как ObservableCollection<ObservableCollection<MyItem>> (который просто сбивает с толку!).По сути, внешняя коллекция - это Группы, а внутренняя коллекция содержит отображаемые элементы.Мои элементы даже реализуют интерфейс INotifyPropertyChanged.Я ожидал, что обновления свойств моего элемента будут автоматически отражаться в моей привязке данных, а не только добавление или удаление элементов из коллекции.

Если я переключаю значение свойства, ничего не происходит, пока я не вручнуюобновить привязку, которая требует полной перезагрузки.Вполне возможно, что этот элемент управления не отвечает на события, измененные свойством отдельных элементов.

Мне нужна помощь в выяснении, что я могу сделать, чтобы вызвать обновление отдельного элемента списка после того, как я изменил свойствосвязанного объекта?

Обновление:

Клаус, код, который вы создали, был ОЧЕНЬ полезен (извините, у меня недостаточно представителей, чтобы проголосовать за вас!) Используя этот код, я смог значительно упростить свой код и выполнить больше тестов, но это все равно не решило мою проблему.

То, что я сейчас определил, это то, что моя привязка в порядке.Если я изменяю свойство при привязке просто к текстовому полю 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>

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

Я решил проблему. Проблема заключалась в том, что я передавал весь объект в 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}"

0 голосов
/ 18 июля 2011

Можете ли вы проверить, что в привязке вы не используете OneTime в качестве режима привязки (вместо OneWay)?

Я без проблем использовал привязку данных в элементах списка, привязанного к LongListSelector - Iподозреваю, что проблема заключается не в LongListSelector, а в вашей привязке или INotifyPropertyChanged ... вы можете опубликовать некоторый код (в идеале привязку, а также объекты, которые будут связаны).

...