2017-10-08 7 views
0

私は次のように私は初期化ObservableCollectionRangeにおけるソーシャルメディアのコレクションを持っている:私の下Observable CollectionのItemプロパティをSwitchステータスにバインドする方法はありますか?

public ObservableRangeCollection<SocialMediaEntity> CurrentSocialMedia { get; } = new ObservableRangeCollection<SocialMediaEntity>(); 

は、Webサービスのリストを取得し、私は、コレクション内のこれらの要素を保つ:

GetSonInformation().Subscribe((SonInformation) => 
       { 
        CurrentSon = SonInformation.Son; 
        CurrentSocialMedia.ReplaceRange(SonInformation.SocialMedia); 

       }); 

このページでは、トークンが有効な場合に有効にするスイッチコンポーネントがあり、トークンが無効であるか、コレクションにそのようなソーシャルメディアがない場合は有効ではありません。

<Switch Grid.Column="1" 
     VerticalOptions="Center" 
    HorizontalOptions="End" 
    IsToggled="{Binding Path=CurrentSocialMedia, 
    Converter={StaticResource SocialMediaStatusToBoolConverter}, 
    ConverterParameter={StaticResource youtubeKey}}"> 

    <Switch.Behaviors> 
     <behaviors:EventHandlerBehavior EventName="Toggled"> 
      <behaviors:InvokeCommandAction 
       Command="{Binding ToggleYoutubeSocialMediaCommand}" 
       Converter="{StaticResource SwitchChangeEventArgsConverter}"/> 

                </behaviors:EventHandlerBehavior> 

              </Switch.Behaviors> 
             </Switch> 

私が行ったアプローチは、コレクションをリンクし、前に説明したロジックでブール値を返すコンバータを使用することです。

public class SocialMediaStatusToBoolConverter : IValueConverter 
    { 

     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 

      IList<SocialMediaEntity> SocialMedias = (IList<SocialMediaEntity>)value; 

      if (SocialMedias == null || SocialMedias.Count() == 0) 
       return false; 

      var socialMedia = SocialMedias.SingleOrDefault(social => social.Type.Equals((string)parameter)); 

      return socialMedia != null && !socialMedia.InvalidToken; 
     } 


     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return value; 
     } 
    } 

問題はこれが初めてのことです。すべてのアイテムを置き換えるか、別のアイテムを追加してコレクションを更新すると、何も更新されません。

これを行うにはどのようなアプローチが必要か教えてください。前もって感謝します。私はあなたがSwitchとしてごSocialMediaEntity

答えて

1

にINotifyPropertyChangedのを実装するために持っていると思う

1

IsToggledプロパティのコレクションを期待されていない、それはコレクションがバインドされたデータの変更イベントを監視しません。そうではないa Picker would do for ItemsSource.

したがって、onusはビューモデルに戻ります。基本的に、ビューモデルは、コレクションが変更されるたびにCurrentSocialMediaのproperty-changed-eventが呼び出されるようにする必要があります。例えばのために

void OnPropertyChanged(object sender, PropertyChangedEventArgs args) 
{ 
    if(args.PropertyName != nameof(CurrentSocialMedia)) 
     return; 

    var oldObservable = oldValue as INotifyCollectionChanged; 
    if (oldObservable != null) 
     oldObservable.CollectionChanged -= CollectionChanged; 

    var newObservable = newValue as INotifyCollectionChanged; 
    if (newObservable != null) { 
     newObservable.CollectionChanged += CollectionChanged; 
    } 
} 

void CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    RaisePropertyChanged(nameof(CurrentSocialMedia)); 
} 
関連する問題