【问题标题】:Why cant I update ComboBox display when triggering another control event?为什么触发另一个控件事件时无法更新 ComboBox 显示?
【发布时间】:2018-06-22 23:51:25
【问题描述】:

我正在开发一个应用程序,我正在使用模板 10 和 MVVM 模式来进行数据处理

我有一个 DatePicker 和一个组合框,当我通过构造函数或导航到页面事件设置组合框时,组合框被设置并显示设置的值。

我的组合框用于设置两周(24 种不同的选择),因此我想添加一个事件,即每当我更改日期选择器事件时,我都会自动在组合框中设置两周,并根据所选日期显示适当的两周。

但是,当我设置一个新日期时,我的组合框变为空白或空值,什么也不显示,我的转换器将我的枚举转换为 int 值,但它没有显示在我的组合框中这是我的 xaml控制:

<DatePicker x:Name="PaymentDateSeniorityInfoDatePicker"
                                    Date="{Binding PaymentDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DateToDatePickerConverter}}"
                                    DateChanged="{x:Bind ViewModel.PaymentDateChanged}"
                                    IsEnabled="{x:Bind ViewModel.ControlEnabled, Mode=OneWay, FallbackValue='true'}"/>

<ComboBox x:Name="FortnightNumberSeniorityBonusInfoComboBox"
                                  ItemsSource="{x:Bind ViewModel.Fortnights, Mode=OneWay}"
                                  SelectedValuePath="Value"
                                  DisplayMemberPath="Display"
                                  SelectedValue="{Binding FortnightNumber, Mode=TwoWay, Converter={StaticResource EnumItemsConverter}}"
                                  SelectedIndex="{Binding FortnightNumber, Mode=OneWay, Converter={StaticResource EnumItemsConverter}}"
                                  IsEnabled="{x:Bind ViewModel.ControlEnabled, Mode=OneWay}"/>

这是当我导航到页面时设置我的组合框的逻辑事件

public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary<string, object> state)
{
    ShowAndHideButtons();
    AreAdsCollapsed = AdsCollapsed();
    LoadSeniorityBonusInfo();//This method set my fortnights
    await ExecutedRefreshedAsync();
    await base.OnNavigatedToAsync(parameter, mode, state);
}

void LoadSeniorityBonusInfo()
{
    SeniorityBonusInfo.FortnightNumber = GetFortnight(SeniorityBonusInfo.PaymentDate.Value);
    SeniorityBonusInfo.DaysOfSalary = GetDaysOfSalary(LaborInfo, PersonalInfo);
    SeniorityBonusInfo.SeniorityBonusPayment = CalculateSenorityBonus(SeniorityBonusInfo.DaysOfSalary, SeniorityBonusInfo.CurrentBasicSalary);
}

这是设置我新两周的活动:

public void PaymentDateChanged()
{
    SeniorityBonusInfo.FortnightNumber = GetFortnight(SeniorityBonusInfo.PaymentDate.Value);
}

最后这是我的枚举转换器:

public class EnumItemsConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (!value.GetType().GetTypeInfo().IsEnum)
            return false;

        var enumName = value.GetType();
        var obj = Enum.Parse(enumName, value.ToString());

        return System.Convert.ToInt32(obj);
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        var enumType = (value as Enum).GetType();
        return Enum.ToObject(enumType, System.Convert.ToInt32(value));
    }
}

有人可以帮我解决这个问题吗?在设置另一个控件时,我忘记或跳过什么以便更新组合框等控件。

它可以毫无问题地与文本块一起使用,但在这种情况下它不起作用。

感谢一些指导谢谢!!!

更新

我正在添加一个人问我的课程。

ValidatableModelBase 是 Template10 中的一个类。Jerry Nixon 开发的Validation 库是一个 github 项目,您可以通过 github 将其添加到您的项目中。

至于 BonusDays 和 Fortnight 只是枚举,这是我的枚举:

public enum BonusDays : Int32
{
    [Display(Name = "EnumBonusDays0")]
    BonusDays0 = 0,
    [Display(Name = "EnumBonusDays18")]
    BonusDays18 = 1,
    [Display(Name = "EnumBonusDays33")]
    BonusDays33 = 2,
    [Display(Name = "EnumBonusDays48")]
    BonusDays48 = 3,
    [Display(Name = "EnumBonusDays63")]
    BonusDays63 = 4,
    [Display(Name = "EnumBonusDays93")]
    BonusDays93 = 5,
    [Display(Name = "EnumBonusDays108")]
    BonusDays108 = 6
}

public enum Fortnight : Int32
{
    [Display(Name = "EnumFortnightQ00")]
    Q00 = 0,
    [Display(Name = "EnumFortnightQ01")]
    Q01 = 1,
    [Display(Name = "EnumFortnightQ02")]
    Q02 = 2,
    [Display(Name = "EnumFortnightQ03")]
    Q03 = 3,
    [Display(Name = "EnumFortnightQ04")]
    Q04 = 4,
    [Display(Name = "EnumFortnightQ05")]
    Q05 = 5,
    [Display(Name = "EnumFortnightQ06")]
    Q06 = 6,
    [Display(Name = "EnumFortnightQ07")]
    Q07 = 7,
    [Display(Name = "EnumFortnightQ08")]
    Q08 = 8,
    [Display(Name = "EnumFortnightQ09")]
    Q09 = 9,
    [Display(Name = "EnumFortnightQ10")]
    Q10 = 10,
    [Display(Name = "EnumFortnightQ11")]
    Q11 = 11,
    [Display(Name = "EnumFortnightQ12")]
    Q12 = 12,
    [Display(Name = "EnumFortnightQ13")]
    Q13 = 13,
    [Display(Name = "EnumFortnightQ14")]
    Q14 = 14,
    [Display(Name = "EnumFortnightQ15")]
    Q15 = 15,
    [Display(Name = "EnumFortnightQ16")]
    Q16 = 16,
    [Display(Name = "EnumFortnightQ17")]
    Q17 = 17,
    [Display(Name = "EnumFortnightQ18")]
    Q18 = 18,
    [Display(Name = "EnumFortnightQ19")]
    Q19 = 19,
    [Display(Name = "EnumFortnightQ20")]
    Q20 = 20,
    [Display(Name = "EnumFortnightQ21")]
    Q21 = 21,
    [Display(Name = "EnumFortnightQ22")]
    Q22 = 22,
    [Display(Name = "EnumFortnightQ23")]
    Q23 = 23,
    [Display(Name = "EnumFortnightQ24")]
    Q24 = 24
}

我正在使用 Display 属性将显示值从英语本地化为西班牙语,反之亦然!!!

这是我的 valuedispl;帮助我进行本地化的课程:

public class ValueDisplay
{
    public Enum Value { get; set; }
    public string Display { get; set; }
}

这是帮助我进行本地化的枚举扩展:

public static class EnumExtensions
{
    public static string Display(this Enum eValue)
    {
        var nAttributes = eValue.GetType().GetField(eValue.ToString()).GetCustomAttributes(typeof(DisplayAttribute), false);
        var DisplayName = string.Empty;
        if (nAttributes.Any())
        {
            DisplayName = GetLocalizeString((nAttributes.FirstOrDefault() as DisplayAttribute).Name);
            return DisplayName;
        }
        else
        {
            throw new ArgumentException("No hay Attributo asignado para el Enum");
        }
    }
}

最后这是我的本地化字符串类

public static class LocalizeService
{
    public static string GetLocalizeString(string varName)
    {
        return App.Loader.GetString(varName);
    }
}

希望这可以为您提供足够的信息,感谢您的关注!

【问题讨论】:

    标签: c# mvvm combobox uwp template10


    【解决方案1】:

    我解决了它,但我不得不使用常规事件并保留我的 viewmodel x:bind 方法。我只是在 DateChanged 事件的 datepicker 上放置了一个事件,并在后面的代码中设置了组合框索引。这是我的 xaml 和代码背后的代码。

    我不喜欢这个解决方案,但因为我不想仅仅因为这个而停在这里,它会起作用,同时我会发现如何使用 MVVM 模式完全解决它。

    希望有人比我有更好的解决方案。

    这是我的代码:

    XAML:

    <DatePicker x:Name="PaymentDateSeniorityInfoDatePicker"
                                        Date="{Binding PaymentDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DateToDatePickerConverter}}"
                                        DateChanged="PaymentDateSeniorityInfoDatePicker_DateChanged"
                                        IsEnabled="{x:Bind ViewModel.ControlEnabled, Mode=OneWay, FallbackValue='true'}"/>
    

    视图模型:

    public void PaymentDateChanged()
        {
            SeniorityBonusInfo.FortnightNumber = GetFortnight(SeniorityBonusInfo.PaymentDate.Value);
        }
    
    public SeniorityBonusDTO SeniorityBonusInfo
        {
            get { return _SeniorityBonusInfo; }
            set { Set(ref _SeniorityBonusInfo, value); }
        }
    

    我的 DTO 模型:

     public class SeniorityBonusDTO : ValidatableModelBase
     {
        [Required]
        public DateTime? PaymentDate
        {
            get { return Read<DateTime?>(); }
            set { Write(value, nameof(PaymentDate), false); }
        }
    
        [Required]
        public decimal? CurrentBasicSalary
        {
            get { return Read<decimal?>(); }
            set { Write(value, nameof(CurrentBasicSalary), false); }
        }
    
        [Required]
        public BonusDays DaysOfSalary
        {
            get { return Read<BonusDays>(); }
            set { Write(value, nameof(DaysOfSalary), false); }
        }
    
        [Required]
        public Fortnight FortnightNumber
        {
            get { return Read<Fortnight>(); }
            set { Write(value, nameof(FortnightNumber), false); }
        }
    
        [Required]
        public decimal? SeniorityBonusPayment
        {
            get { return Read<decimal?>(); }
            set { Write(value, nameof(SeniorityBonusPayment), false); }
        }
    }
    

    还有我的代码:

    private void PaymentDateSeniorityInfoDatePicker_DateChanged(object sender, DatePickerValueChangedEventArgs e)
        {            
            ViewModel.PaymentDateChanged();
            FortnightNumberSeniorityBonusInfoComboBox.SelectedIndex = (int)ViewModel.SeniorityBonusInfo.FortnightNumber;
        }
    

    如果有人有更好的主意,我会很感激你的帮助,谢谢!!!

    【讨论】:

    • 我刚刚添加了您可能需要的信息,希望这已经足够了!!谢谢你的帮助!!!
    • GetFortnightGetDaysOfSalaryCalculateSenorityBonus 方法在哪里? LaborInfoPersonalInfo 是什么?
    猜你喜欢
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多