为什么这个UWP ComboBox在初始化后可以为空白但是可以正常选择?

时间:2016-08-23 01:18:08

标签: c# xaml combobox uwp uwp-xaml

我有一个像这样的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;
    }
}

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

它是空白的,因为你首先没有选择任何东西。如果我没有弄错,您必须使用SelectedItem来绑定您的选择,或使用SelectedValue SelectedValuePath绑定。

我实际上从不使用SelectedValue自己SelectedValuePath,所以在初始化ComboBox.ItemSource绑定到的项目集合后 - 例如ObservableCollection<Person> Persons {get; set;} - 我还设置了所选项属性{ {1}}到集合中的一个值。然后我将ComboBox.SelectedItem绑定到此属性,因此在初始化时它显示预定义的选定值。

我猜您可以使用Person SelectedPerson {get; set;}SelectedValue达到相同的效果,但您必须将它们一起用作described here

答案 1 :(得分:1)

我使用x:绑定ItemResource并在代码后面添加了ViewModel,并解决了这个问题。

答案 2 :(得分:0)

ComboBox不是空白,但它不知道如何呈现您的MaxXXAgeMembers。您应该使用ItemTemplate告诉他。对于Ex:

<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>