2011-07-18 12 views
1

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> 
+0

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

あなたはhttps://gist.github.com/1089190 –

+0

のようなものを使ってそれを単純化することができます。その実装はObserveableとは思えません。このクラスに単純なグループ化リストを設定するコードの例を投稿できますか?多分ラムダなどのようなものを渡すように見えます。 – CactusPCJack

+0

List の代わりにObservableCollection を実装させることができます。実装は次のようなものです:GroupedUsers = new LongListCollection (users、u => u.Name [0]); –

答えて

2

私はこの問題を解決しました。問題は、オブジェクト内で変更された特定のプロパティではなく、オブジェクト全体をIValueConverterに渡していることでした。私は、具体的に可視にブール値の変換を処理するために変換器を変更し、結合を固定:

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(); 
    } 
} 

結合から変更された:LongListSelectorのデータバインディングに関しては
Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}, Path=IsFavorite}"

+0

Hey CactusPCJack、ItemTemplate TextBlockのForeGroundを変更しようとしたことがありますか?私はこれをやろうとしていますが、バインディングは失敗しています... – Depechie

0

あなたのバインディングあなたが(代わりに、一方向の)結合様式としてワンタイムを使用していないでいることを確認することはできますか?

LongListSelectorにバインドされたリスト内の項目に問題なくデータバインディングを使用しました。問題はLongListSelectorにあるとは限りませんが、バインディングまたはINotifyPropertyChangedを使用してコードを投稿できます(理想的にはバインディング、およびバインドされているオブジェクトも理想的です)。

+0

はい、ワンタイムではないことを確認できます。それはOneWayです。コレクションから削除されたアイテムは消え、追加されたアイテムは表示されますが、プロパティの変更はバインディングを更新するようには見えません。 – CactusPCJack

+0

私はできるだけプロジェクトをシンプルにして共有しようとしましたが、ここに投稿するのは適切ではありません。私はすぐにハイライトを投稿しようとします。 – CactusPCJack

+0

質問の更新情報をご覧ください。最初のリストの人口はうまくいくようですが、IValueConverterにバインドされたときにフィールドに更新が反映されないことがあります。 – CactusPCJack

関連する問題