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의 값이 새 값으로 변경되기 전에 (그리고 브레이크 포인트 벌금을 치는). 값은 사용자 인터페이스에 표시되지 않습니다.
동시에 'ItemsSource'와 'SelectedItem'을 설정하는 것은 XAML에서 악명 높은 문제 영역입니다. 순서가 맞아야하고 설정 한 다른 속성도 영향을 미칠 수 있습니다. –