2015-05-07 3 views
0

У меня есть ComboBox с двумя элементами (покупка и продажа). но когда PropertyChanged (Sell) все еще не обновляет comboBox (по-прежнему выбран Buy). Я работаю с VS2013 с .Net 4.5 с приложением Windows. Пожалуйста, помогите мне. Это XMAL кодЭлемент Combobox не обновляется при изменении свойств

<ComboBox HorizontalAlignment="Left" Grid.Row="5" Grid.Column="0" x:Name="cmbInputAction" VerticalAlignment="Top" Margin="10,0,0,0" Width="195" ItemsSource="{Binding OrderActions}" DisplayMemberPath="DisplayName" SelectedItem="{Binding CurrentOrderAction, Mode=TwoWay}"/> 

Это мой ViewModel

public static readonly DependencyProperty CurrentOrderActionProperty = 
     DependencyProperty.Register("CurrentOrderAction", typeof(ComboBoxItem), typeof(OrderScreenViewModel), 
            new PropertyMetadata(new ComboBoxItem("Buy", 1))); 

    public ComboBoxItem CurrentOrderAction 
    { 
     get { return (ComboBoxItem)GetValue(CurrentOrderActionProperty); } 
     set 
     { 
      if (value != null) 
      { 
       SetValue(CurrentOrderActionProperty, value); **//Now Value is Sell but still not display sell value in combobox** 
       if (PropertyChanged != null) 
        PropertyChanged(this, new PropertyChangedEventArgs("CurrentOrderAction")); **// Fired this event** 

      } 

     } 
    } 

Я попытался сильфонные изменения для XMAL. но все еще не исправлены.

  1. SelectedValue="{Binding CurrentOrderAction, Mode=TwoWay}"
  2. SelectedItem="{Binding Path = CurrentOrderAction, Mode=TwoWay}"
  3. SelectedValue="{Binding path= CurrentOrderAction, Mode=TwoWay}"
  4. SelectedItem="{Binding Path = CurrentOrderAction, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+0

Кажется, что вы пытаетесь установить выбранный элемент combobox для себя, попробуйте создать фиктивную строковую переменную и установите для нее выбранный элемент. – Pseudonym

ответ

0
public class ComboBoxItem 
    { 
    private string displayName; 
    private int value; 

    public int Value 
    { 
     get { return this.value; } 
     set { this.value = value; } 
    } 

    public string DisplayName 
    { 
     get { return displayName; } 
     set { displayName = value; } 
    } 

    public ComboBoxItem() 
    { 

    } 

    public ComboBoxItem(string name, int value) 
    { 
     this.displayName = name; 
     this.value = value; 
    } 

    **public override bool Equals(object obj) 
    { 
     return (obj is ComboBoxItem) && (obj as ComboBoxItem).Value.Equals(this.Value); 
    }** 
} 
1

Я не 100% уверен, что это ваша проблема, но я 100% уверен, что вы делаете вещи неправильно ,

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

Система привязки работает на гораздо более низком уровне, чем ваше имущество. Поэтому, когда пользователь обновляет значение, к которому привязан DependencyProperty, код установщика, определенный в вашем классе, не будет выполняться.

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

#region SomeProperty 
    /// <summary> 
    /// The <see cref="DependencyProperty"/> for <see cref="SomeProperty"/>. 
    /// </summary> 
    public static readonly DependencyProperty SomePropertyProperty = 
     DependencyProperty.Register(
      SomePropertyPropertyName, 
      typeof(object), 
      typeof(MainWindow), 
      new UIPropertyMetadata(null, OnSomePropertyPropertyChanged)); 

    /// <summary> 
    /// Called when the value of <see cref="SomePropertyProperty"/> changes on a given instance of <see cref="MainWindow"/>. 
    /// </summary> 
    /// <param name="d">The instance on which the property changed.</param> 
    /// <param name="e">The <see cref="System.Windows.DependencyPropertyChangedEventArgs"/> instance containing the event data.</param> 
    private static void OnSomePropertyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     (d as MainWindow).OnSomePropertyChanged(e.OldValue as object, e.NewValue as object); 
    } 

    /// <summary> 
    /// Called when <see cref="SomeProperty"/> changes. 
    /// </summary> 
    /// <param name="oldValue">The old value</param> 
    /// <param name="newValue">The new value</param> 
    private void OnSomePropertyChanged(object oldValue, object newValue) 
    { 
     ; 
    } 

    /// <summary> 
    /// The name of the <see cref="SomeProperty"/> <see cref="DependencyProperty"/>. 
    /// </summary> 
    public const string SomePropertyPropertyName = "SomeProperty"; 

    /// <summary> 
    /// 
    /// </summary> 
    public object SomeProperty 
    { 
     get { return (object)GetValue(SomePropertyProperty); } 
     set { SetValue(SomePropertyProperty, value); } 
    } 
    #endregion 

Обратите внимание на обратный вызов конфигурируется в объекте метаданных передается методу Register.

Ваша вторая ошибка вызывает PropertyChanged в настройщике вашего DependencyProperty. Это обрабатывается системой связывания. Вы просто называете это второй раз (когда вы используете свойство из своего кода, конечно).

Третья проблема заключается в том, что ваша собственность имеет тип ComboBoxItem. Какого черта. Это не так, как это работает. Вы должны привязываться к моделям и позволять интерфейсу пользовательского интерфейса создавать ComboBoxItems. Упростить код этого:

// here's your model 
public class OrderAction 
{ 
    public string Name {get;set;} 
} 

// here's your VM 
public class OrderActionViewModel 
{ 

    public ObservableCollection<OrderAction> Actions { get; private set; } 
    // INotifyPropertyChanged implementation left off the following 
    public OrderAction CurrentAction { get; set; } 
} 

И вот вашего связывание

<ComboBox ItemsSource="{Binding Actions}" 
      SelectedItem="{Binding CurrentAction}" /> 

Теперь, до тех пор, как например в CurrentAction является одним из случаев, в Actions, то ComboBox покажет правильное выбранное действие.

Например, если вы сделали это, будет выбран

CurrentAction = Actions.Last(); 

Последний элемент в поле со списком.

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