2015-01-19 5 views
0

ObservableList (ObservableCollection에서 상속 가능한 목록)에 바인딩 된 콤보 상자가 있습니다. 여기 내 캐리어 객체입니다XAML WinRT ComboBox SelectedItem 설정

public class Carrier 
{ 
    /// <summary> 
    /// The carrier's name as it should be displayed to customers 
    /// </summary> 
    public string Name { get; set; } 

    /// <summary> 
    /// This is the domain that email-to-text messages should be sent to. 
    /// </summary> 
    public string TextBase { get; set; } 

    /// <summary> 
    /// Unique identifier for carriers 
    /// </summary> 
    public int CarrierId { get; set; } 
} 

내 문제는 내 뷰 모델에, 내가 선택한 항목의 값을 설정하려고하고 그것은 UI에서 설정되지 않습니다. 콤보 상자에서 옵션을 선택하면 내 뷰 모델을 올바르게 수정하고 있습니다 (바인딩이 작동하는 것을 알 수 있습니다). 여기

내 XAML입니다 :

   <ComboBox ItemsSource="{Binding ElementName=UserInformationPage, Path=DataContext.PhoneCarriers}" 
         Style="{StaticResource ComboBox}" 
         Width="250" 
         DisplayMemberPath="Name" 
         SelectedItem="{Binding Path=SelectedCarrier, Mode=TwoWay}" 
         SelectedValuePath="CarrierId" 
         /> 

여기 내 뷰 모델입니다 : 내가 말했듯이

public Carrier SelectedCarrier 
    { 
     get { return _selectedCarrier != null ? PhoneCarriers.First(c => c.CarrierId == _selectedCarrier.CarrierId) : PhoneCarriers.First(); } 
     set 
     { 
      if (_selectedCarrier == null || _selectedCarrier.CarrierId != value.CarrierId) 
      { 
       Set(ref _selectedCarrier, value); 
       if (User != null) 
        User.Phone.Carrier = value; 
      } 
     } 
    } 

    public UserDemographicsViewModel() 
    { 
     MessengerInstance.Register<SelectedUser>(this, m => 
     { 
      User = m.User; 
      CheckCanShowPassword(); 
      CheckCanResetPassword(); 
     }); 

     NavigationService.Navigated += (s, e) => 
     { 
      if (e.Parameter is User) 
      { 
       User = e.Parameter as User; 
       if (User.Phone != null) 
       { 
        SelectedCarrier = User.Phone.Carrier; 
       } 
      } 
     }; 

     IsPasswordTextShown = false; 
     TogglePasswordCommand = new RelayCommand(() => IsPasswordTextShown = !IsPasswordTextShown); //flip the state of password shown 
     SaveUserCommand = new RelayCommand<User>(SaveUser, u => CanSaveUser()); 
     ResetPasswordCommand = new RelayCommand(TryResetPassword,() => User != null && User.UserId != 0); //we have a user and its not a new user 



     var repo = IoCContainer.GetContainer().Resolve<IAccountRepository>(); 
     var loggedInUser = App.Session.Get<User>("AuthenticatedUser"); 
     PhoneCarriers = new ObservableList<Carrier>(repo.GetPhoneCarriers(loggedInUser.AccountId)); 

    } 

, 나는 내가 SelectedCarrier 속성에 제대로 바인딩 오전 알고 있지만 어떤 이유로 들어, SelectedCarrier가 PhoneCarriers 컬렉션의 값과 일치 할 때 드롭 다운 값이 공백으로 표시됩니다. 내가 드롭 다운 값을 변경하는 경우 때 디버깅, 내가 볼 수 있기 때문에 내가 선택한 캐리어를 알고

public Carrier SelectedCarrier 
    { 
     get { return _selectedCarrier; } 
     set 
     { 
      if (_selectedCarrier == null || _selectedCarrier.CarrierId != value.CarrierId) 
      { 
       _selectedCarrier = value; 
       RaisePropertyChanged("SelectedCarrier"); 
       if (User != null) 
        User.Phone.Carrier = value; 
      } 
     } 
    } 

: 나는 다음 내 SelectedCarrier 속성을 단순화 시도

업데이트

_selectedCarrier의 값이 새 값으로 변경되기 전에 (그리고 브레이크 포인트 벌금을 치는). 값은 사용자 인터페이스에 표시되지 않습니다.

+0

동시에 'ItemsSource'와 'SelectedItem'을 설정하는 것은 XAML에서 악명 높은 문제 영역입니다. 순서가 맞아야하고 설정 한 다른 속성도 영향을 미칠 수 있습니다. –

답변

0

코드를 단순화하여 추가 논리없이 백킹 필드를 사용하는 간단한 속성으로 잘 작동하는지 확인하려고합니다. Set() 메서드가 변경 알림을 올린다고 가정합니다.

내가 설정 한 이동 통신사가 현재 사용하고있는 것과 다를 수 있으며 내부적으로 바인딩이 작동하는 방식에 대해 자세히 알지 못한다고 생각되지만 그 이유는 문제는 당신이 설정 한 것이 즉시 얻은 것과 같지 않다면 말입니다. setter와 getter에 중단 점을 넣고 바인딩을 설정 한 후에 바인딩이 새 값을 얻으려고하는지 확인하십시오. 아마도 이들은 서로 다른 인스턴스가 될 수 있지만 유형은 Equals()GetHashCode() 메쏘드를 덮어 써야 할 수 있으므로 다른 출처의 인스턴스가 동일하게 보입니다. 전반적으로 논리를 단순히 배킹 필드에 액세스하는 것 이상의 결합 할 수있는 속성 게터에 넣는 것은 위험한 방법입니다.

+0

감사합니다. Filip. getter/setter 논리를 단순화했지만 여전히 UI에 설정된 속성이 표시되지 않습니다. 내 질문을 새 코드로 업데이트했습니다. – Mike

+0

문제를 해결할 수 있었던 것처럼 보였습니다. 그래도 내가 변경 한 내용이 어떻게 수정되었는지 아직 이해할 수 없습니다. – Mike

2

그래서 문제는 내 xaml과 관련이 있지만 왜 작동하지 않는지 잘 모르겠습니다. 내가 변경하는 경우 :

<ComboBox ItemsSource="{Binding ElementName=UserInformationPage, Path=DataContext.PhoneCarriers}" 
        Style="{StaticResource ComboBox}" 
        Width="250" 
        DisplayMemberPath="Name" 
        SelectedItem="{Binding Path=SelectedCarrier, Mode=TwoWay}" 
        SelectedValuePath="CarrierId" 
        /> 

에 :

<ComboBox ItemsSource="{Binding PhoneCarriers}" 
         Style="{StaticResource ComboBox}" 
         Width="500" 
         SelectedValuePath="CarrierId" 
         DisplayMemberPath="Name" 
         SelectedItem="{Binding SelectedCarrier, Mode=TwoWay}" 

         /> 

그것은로드의 드롭 다운에서의 selectedItem을 보여주는 시작했다.

+0

로드 할 때 항목을 선택하지 않는다는 점에서 비슷한 문제가 발생했습니다.원래는 "ItemsSource"를 콤보 박스 요소의 마지막으로 정의 된 속성으로 사용 했으므로 작동하지 않으므로이를 변경하고 처음부터 시작하여 작동합니다. –