2014-10-27 4 views
0

у меня есть этот выпадающий:выпадающего товара оленьей кожи обновить

<ComboBox ItemsSource="{Binding Knobs.AvailableFlightModes}" 
    SelectedValue="{Binding Knobs.FlightMode}" SelectedValuePath="Value" /> 

контекст данных реализует INotifyPropertyChanged интерфейса, а в коде я проверить, если FlightMode, который был выбран в порядке, и если не я изменить его. проблема заключается в том, что я меняю его обратно на отображаемый элемент doesent change back. например: выбранный элемент был item1, пользователь изменил его на item2, и он изменил его на item1, но на дисплее все еще находится item2.

вот пример кода:

public class Names : INotifyPropertyChanged 
{ 
    public Names() 
    { 
     m_NewList = new ObservableCollection<thing>(); 
     foreach (things item in Enum.GetValues(typeof(things))) 
     { 
      m_NewList.Add(new thing() { Enum = item }); 
     } 

     this.PropertyChanged += new PropertyChangedEventHandler(Names_PropertyChanged); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    void Names_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "Stuff" && m_Stuff != things.a) 
     { 
      Stuff = things.a; 
     } 
    } 

    private readonly ObservableCollection<thing> m_NewList; 
    public ObservableCollection<thing> NewList { get { return m_NewList; } } 

    private things m_Stuff; 
    public things Stuff 
    { 
     get { return m_Stuff; } 
     set 
     { 
      m_Stuff = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Stuff")); 
     } 
    } 
} 

public class thing 
{ 
    public things Enum { get; set; } 
    public string Just { get; set; } 
    public override string ToString() 
    { 
     return Enum.ToString(); 
    } 
} 

public enum things { a, b, c, d } 

-

<ComboBox ItemsSource="{Binding NewList}" SelectedValuePath="Enum" SelectedValue="{Binding Stuff}" /> 
+0

Опубликовать соответствующий код в поле зрения модели. –

+0

@SriramSakthivel я сделал – Nataly87

ответ

1

Я вижу проблему. По какой-то причине кажется, что Binding framework игнорирует уведомление об изменении свойства, когда оно уже находится внутри уведомления.

В качестве обходного пути вы можете отложить изменение свойства, выполнив его асинхронно. Это работает так, как ожидалось.

void Names_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => 
    { 
     if (e.PropertyName == "Stuff" && m_Stuff != things.a) 
     { 
      Stuff = things.a; 
     } 
    })); 
} 
0

Убедитесь, что вы называете NotifyPropertyChanged ("FlightMode"), когда свойство FlightMode устанавливается на объекте Ручки.

Смежные вопросы