[英]Why this UWP ComboBox can be blank after initialization but works fine for selection?
我有一个像这样的ComboBox
<ComboBox
Grid.Column="1"
Padding="5,0,0,0"
DisplayMemberPath="Description"
SelectedItem="{Binding MaxXXAge, Mode=TwoWay, Converter={StaticResource MaxXXAgeToMaxXXAgeMemberConverter}}"
ItemsSource="{Binding ElementName=SettingsXXScrollViewer, Path=DataContext.MaxXXAgeMemberGroup, Mode=OneWay}" />
但是,初始化后,组合框为空。 在此之后,它实际上可以正常工作。 我可以按预期选择并显示所选项目。 只是乍一看是行不通的。 但是,我已经初始化了MaxXXAge,并且触发了转换器。 这是小组
public IReadOnlyList<MaxXXAgeMembers> MaxXXAgeMemberGroup { get { return MaxXXAgeMembers.Options; } }
这是MaxXXAgeMembers的定义
public class MaxXXAgeMembers
{
public MaxXXAge MaxXXAge { get; private set; }
public string Description { get; private set; }
public static readonly IReadOnlyList<MaxXXAgeMembers> Options = new ReadOnlyCollection<MaxXXAgeMembers>(new[]
{
new MaxXXAgeMembers { MaxXXAge = MaxXXAge.OneDay, Description = Strings.SettingSync_OneDay},
.......
});
public static MaxXXAgeMembers FromMaxXXAge(MaxXXAge maxXXAge)
{
return Options.First(option => option.MaxXXAge == maxXXAge);
}
}
//稍后添加了覆盖等于
public override bool Equals(object obj)
{
if (obj == null || !(obj is MaxEmailAgeMembers))
return false;
return ((MaxEmailAgeMembers)obj).Description.Equals(this.Description);
}
public override int GetHashCode()
{
return this.Description.GetHashCode();
}
转换器是这样的
public sealed class MaxEmailAgeToMaxEmailAgeMemberConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
return WPSettingsEmailViewModel.MaxEmailAgeMembers.FromMaxEmailAge((MaxEmailAge)value);
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return ((WPSettingsEmailViewModel.MaxEmailAgeMembers)value).MaxEmailAge;
}
}
任何想法?
它是空白的,因为您首先没有选择任何内容。 如果我没有记错的话,你必须要么使用SelectedItem
绑定您的选择或SelectedValue
与 SelectedValuePath
。
事实上,我从来没有使用SelectedValue
与SelectedValuePath
自己,所以其初始化将ComboBox.ItemSource被绑定到项目收集后-例如ObservableCollection<Person> Persons {get; set;}
ObservableCollection<Person> Persons {get; set;}
-我还设置了选定项目的属性Person SelectedPerson {get; set;}
Person SelectedPerson {get; set;}
为集合中的值之一。 然后,我将ComboBox.SelectedItem绑定到此属性,以便在初始化时显示预定义的选定值。
我想您可以使用SelectedValue
和SelectedValuePath
达到相同的目的,但是您必须按此处所述将它们一起使用。
我使用x:Bind作为ItemResource,并在代码内部添加了ViewModel,并解决了此问题。
您的ComboBox
不是空白,但它不知道如何呈现MaxXXAgeMembers
。 您应该使用ItemTemplate
告诉他。 例如:
<ComboBox
Grid.Column="1"
Padding="5,0,0,0"
SelectedValue="{Binding MaxXXAge, Mode=TwoWay, Converter={StaticResource MaxXXAgeToMaxXXAgeMemberConverter}}"
ItemsSource="{Binding ElementName=SettingsXXScrollViewer, Path=DataContext.MaxXXAgeMemberGroup, Mode=OneWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Description}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.