Элемент управления 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>