2015-12-20 81 views
0

下我的項目模型我有以下枚舉:WPF枚舉結合

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

在視圖模型,我有以下特性:

 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 -is基於當前時間(NextAppointment = AppointmentService.GetNextAppoinment(AppList))計算 - 簡單地返回從APPLIST THW最近任命中狀態 - 從枚舉狀態狀態的名字,計算公式爲:

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結合沒有按沒有工作。你能幫我理解嗎?

+0

*不幸的是,這是行不通的* - 如何? –

+0

狀態綁定到Status枚舉,但選定的值爲空(應爲NextAppointment.Status) – Dmytro

回答

0

只有當您更改屬性「NextAppointment」而不是「NextAppointment」的任何屬性時,「NextAppointment」的PropertyChangedEvent觸發器纔會觸發。

您需要爲物業 「狀態」 也是一個PropertyChangedEvent:

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

我應該在Model中執行此操作嗎? – Dmytro

+0

如果我對TextBlock進行類似的綁定 - 它工作,NextAppointment.Date值出現。爲什麼它在NextAppointment.Status中存在問題? – Dmytro

+0

在你的代碼中設置你選擇的值嗎?這會破壞綁定。我試着用我的代碼示例,它的工作原理。或者我不明白你的問題。當它不工作?當您更改NextAppointment或Status時? – Golwarn