2017-10-08 1 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

IsToggled 속성 컬렉션을 기대하지 않는 당신이 당신의 SocialMediaEntity에에서 INotifyPropertyChanged를 구현해야한다 생각합니다. 좋지 않음 a Picker would do for ItemsSource.

따라서 부담은 다시보기 모델로 돌아옵니다. 기본적으로 뷰 모델은 컬렉션이 변경 될 때마다 CurrentSocialMedia에 대한 속성 변경 이벤트가 발생하도록해야합니다. 예컨대 들어

:

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

나는,이 컬렉션에 바인딩 데이터에 대한 변경 이벤트를 모니터링하지 않습니다 Switch으로

관련 문제