![](/img/trans.png)
[英]Set the SelectionChanged event of a ComboBox while binding its SelectedItem and ItemsSource in XAML
[英]XAML WinRT ComboBox Set SelectedItem
我有一個綁定到ObservableList的組合框(observable列表繼承自ObservableCollection)。 這是我的Carrier對象:
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; }
}
我的問題是,在ViewModel中,我試圖設置所選項目的值,而未在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集合中的值匹配時,下拉列表中的值顯示為空白。
更新資料
我嘗試使用以下方法簡化我的SelectedCarrier屬性:
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的值更改為新值之前看到它的值(並且可以很好地達到斷點)。 該值只是不顯示在用戶界面中。
因此,問題與我的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。
我將嘗試簡化代碼,以查看其是否具有簡單屬性(僅使用備用字段而不使用任何其他邏輯)是否可以正常工作。 我假設您的Set()
方法可以很好地發出更改通知。
我懷疑您要設置的載體與您要獲得的載體不同,並且我不知道綁定如何在內部工作的所有詳細信息,但是我懷疑如果您要設置的載體可能會出現問題設置與您立即獲得的設置不同。 將斷點放在setter和getter中,並確保綁定在設置新值后嘗試獲取新值。 也許這些可能是不同的實例,但是類型可能需要重寫Equals()
和GetHashCode()
方法,以便來自不同來源的實例看起來相同。 總的來說,將邏輯置於可綁定的屬性獲取器中,這不僅僅是簡單地訪問支持字段,這是一個冒險的舉動。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.