longlistselectorコントロールは、私が表示する必要があるリストが非常に長く、そのグループ化機能が好きなので、実装していますが、私はそれを扱うデータバインディングの面で本当に苦労しています。基本的なデータバインディングを得るにはしばらく時間がかかりましたが、完全に機能しています。アイテムが削除または追加された場合、データソースはObservableCollectionから派生しているため、UIは正しく更新されます。WP7 LonglistSelectorデータバインディング - バインドされたアイテムのバインディングへの更新をトリガーする方法
私が抱えている問題は、個々のリストアイテムがグラフィックを表示または非表示にする必要があるかどうかを示す、個々のデータアイテムにフラグを設定していることです。アイデアは、ユーザーがアイテムにホールドジェスチャを実行すると、バインドされたアイテムのプロパティの変更に基づいて、グラフィックをオンまたはオフに切り替えます。
Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}}
グループヘッダのようなを取得するためのLongListSelectorのデータバインディングの要件は、(ちょうどを見て混乱している!)ObservableCollection<ObservableCollection<MyItem>>
のようなデータソースが必要です。基本的に、外側のコレクションはグループで、内側のコレクションには表示されたアイテムが含まれます。私の項目はINotifyPropertyChangedインターフェースを実装しています。私が期待していたのは、コレクションのアイテムの追加や削除だけでなく、アイテムのプロパティの更新が自分のデータバインディングに自動的に反映されることでした。
プロパティの値を切り替えると、完全にリロードする必要があるバインディングを手動で更新するまで何も起こりません。このコントロールは、個々のアイテムのプロパティ変更イベントに応答しない可能性があります。
私が必要とするのは、バインドされたオブジェクトのプロパティを変更した後で個々のリストアイテムの更新をトリガーするためにできることを理解する助けとなりますか?
更新:
クラウス、あなたが作成したコードは、私は非常に私のコードを簡素化することができたそのコードを使用して(!申し訳ありませんが、私はまだあなたを投票するのに十分な担当者を持っていない)非常に有用でした、さらに多くのテストをしますが、それでも私の問題は解決しません。
私が今決定したことは、私の縛りが大丈夫だということです。プロパティを単にテキストフィールド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>
:に
Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}}"
あなたはhttps://gist.github.com/1089190 –
のようなものを使ってそれを単純化することができます。その実装はObserveableとは思えません。このクラスに単純なグループ化リストを設定するコードの例を投稿できますか?多分ラムダなどのようなものを渡すように見えます。 – CactusPCJack
Listの代わりにObservableCollection を実装させることができます。実装は次のようなものです:GroupedUsers = new LongListCollection (users、u => u.Name [0]); –