2017-10-08 57 views
0

我有社交媒體在ObservableCollectionRange的集合,我初始化如下:如何將Observable Collection的Item屬性綁定到Switch狀態?

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

下面我獲得的網絡服務列表,然後我把這些元素集合中:

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

問題是這只是第一次完成。當我通過更換所有項目或添加另一個項目來更新集合時,什麼都不更新。

任何人都可以告訴我我應該採取什麼方法來做到這一點?提前致謝。

回答

1

由於Switch不打算要收集IsToggled屬性,它不會監視收集改變的數據綁定事件。不像a Picker would do for ItemsSource.

所以,責任回到視圖模型。基本上,視圖模型需要確保每次更改集合時都會引發CurrentSocialMedia的屬性更改事件。

對於e.g:

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

我認爲你必須執行INotifyPropertyChanged您SocialMediaEntity

相關問題