繁体   English   中英

为什么此UWP ComboBox在初始化后可以为空白,但可以很好地进行选择?

[英]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

事实上,我从来没有使用SelectedValueSelectedValuePath自己,所以其初始化将ComboBox.ItemSource被绑定到项目收集后-例如ObservableCollection<Person> Persons {get; set;} ObservableCollection<Person> Persons {get; set;} -我还设置了选定项目的属性Person SelectedPerson {get; set;} Person SelectedPerson {get; set;}为集合中的值之一。 然后,我将ComboBox.SelectedItem绑定到此属性,以便在初始化时显示预定义的选定值。

我想您可以使用SelectedValueSelectedValuePath达到相同的目的,但是您必须按此处所述将它们一起使用。

我使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM