【问题标题】:WPF Enum bindingWPF 枚举绑定
【发布时间】:2016-03-26 15:05:39
【问题描述】:

在我的项目中的模型下,我有以下枚举:

public enum Status { Pending, Approved, Skipped, Denied };

以及以下约会课程:

 public class Appointment
    {
        public int Id { get; set; }
        public DateTime Date { get; set; }
        public string Details { get; set; }
        public string Location { get; set; }
        public Status Status { get; set; }
    }

在 ViewModel 中,我有以下属性:

        private Appointment _nextAppointemnt;
        public List<Appointment> AppList { get; set; } 
        public Appointment NextAppointment
        {
            get {  return _nextAppointemnt; }
            set { _nextAppointemnt = value; OnPropertyChanged("NextAppointment"); }
        }
        public string[] Statuses { get; set; }

AppList - 从数据库中获取的约会列表; NextAppointment - 根据当前时间计算 (NextAppointment = AppointmentService.GetNextAppoinment(AppList)) - 仅返回 AppList 中最接近的约会 状态 - 来自枚举状态的状态名称,计算方式为:

Statuses = Enum.GetNames(typeof(Status));

在我的视图中,我有一个组合框 - 它应该具有枚举状态中的所有可能状态,所以我执行以下绑定:

<ComboBox ItemsSource="{Binding Statuses}" />

当我尝试将此组合框的选定值绑定到 NextAppointment.Status 属性时出现问题。

为此,我创建了转换器:

   public class EnumToStringConvertor : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            return value.ToString();
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            return (Status)Enum.Parse(typeof(Status), value.ToString(), true);
        }
    }

并进行以下绑定:

<ComboBox ItemsSource="{Binding Statuses}" SelectedValue="{Binding NextAppointment.Status, Converter={StaticResource EnumConverter}}"/>

很遗憾,它不起作用(组合框的选定值为空)。

但是,如果在 ViewMode 中创建一个单独的属性,将 NextAppointment.Status 分配给它并将其绑定到组合框的 SelectedValue - 所有这些都像魔术一样工作:

public Status NextAppointmentStatus { get; set; }
NextAppointmentStatus = NextAppointment.Status;

 <ComboBox ItemsSource="{Binding Statuses}" SelectedValue="{Binding NextAppointmentStatus, Converter={StaticResource EnumConverter}}"/>

我不明白为什么 NextAppointment.Status 绑定不起作用。你能帮我理解吗?

【问题讨论】:

  • 很遗憾,它不起作用 - 怎么样?
  • 状态绑定到状态枚举,但选择的值为空(应该是 NextAppointment.Status)

标签: c# wpf binding combobox enums


【解决方案1】:

“NextAppointment”的 PropertyChangedEvent 仅在您更改“NextAppointment”属性而不是“NextAppointment”的任何属性时触发。

您还需要 PropertyChangedEvent 属性“状态”:

private Status status;
public Status Status
{
    get{return status;}
    set
    {
        if (status != value)
        {
            status = value;
            OnPropertyChanged("Status");
        }
    }
}

【讨论】:

  • 我应该在模型中做吗?
  • 如果我对 TextBlock 进行类似的绑定 - 它有效,NextAppointment.Date 值就会出现。为什么 NextAppointment.Status 有问题?
  • 在你的代码中设置你选择的值,太?这会破坏绑定。我用我的代码示例进行了尝试,它可以工作。或者我不明白你的问题。什么时候不起作用?当您更改 NextAppointment 或 Status 时?
猜你喜欢
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2018-12-28
  • 2016-03-25
  • 1970-01-01
相关资源
最近更新 更多