WPF PropertyChanged имеет значение null

У меня есть свойство в коде за файлом.

private int? selectedTypeID = null;
public int? SelectedTypeID
{
  get
  {
    return selectedTypeID;
  }
  set
  {
    selectedTypeID = value;
    OnPropertyChanged( "SelectedTypeID" );
  }
}

Это код для PropertyChanged. Проблема упоминается в строке комментариев, см.

#region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged( string propertyName )
    {
      /*PropertyChanged appears to be null in some cases while in some cases it is not null. I have also tried to explicity assigning it the DataContext but that does not work as well. */
      if( PropertyChanged != null )
        PropertyChanged( this, new PropertyChangedEventArgs( propertyName ) );
    }

#endregion


//This line is in DataContext file where the problematic property is assigned a null.
editLayerSidebar.editConditionIngredient.SelectedTypeID = null;

//This is the combobox xaml where SelectedTypeID has been bound to SelectedValue.
<ComboBox x:Name="TypeCombo" Grid.Row="3" Grid.Column="1" Margin="5,5,0,0" 
                  ItemsSource="{Binding DataContext.IngredientTypes, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:EditConditionListLayer}}}"
                  DisplayMemberPath="Name" SelectedValuePath="ID" SelectedValue="{Binding SelectedTypeID, RelativeSource={RelativeSource Mode=Self}}" >

Почему ProperyChanged становится нулевым, что часто приводит к тому, что поле со списком не обновляется? Каким должно быть решение?


person Mohsin Raza    schedule 30.10.2014    source источник
comment
Прекратить настройку propertyName = null?   -  person Scott Solmer    schedule 30.10.2014
comment
Вы когда-нибудь устанавливали DataContext?   -  person furkle    schedule 30.10.2014
comment
попробуйте удалить относительный источник в выбранном значении поля со списком   -  person DLeh    schedule 30.10.2014


Ответы (1)


Я считаю, что вы привязываете SelectedValue неправильно. Сам ваш ComboBox не имеет свойства с именем SelectedTypeID. Это должно быть какое-то свойство вашей модели представления. В этом случае RelativeSource должен пройти вверх по визуальному дереву, чтобы нацелиться на какой-то источник, имеющий DataContext, который вы хотите (в этом случае я предполагаю, что он имеет тип local:EditConditionListLayer), тогда Path должен иметь префикс DataContext:

SelectedValue="{Binding DataContext.SelectedTypeID, 
     RelativeSource={RelativeSource AncestorType={x:Type local:EditConditionListLayer}}}"

Также я сомневаюсь, что даже у самого вашего ComboBox есть DataContext, которое вы хотите, если это так, то это может быть:

SelectedValue="{Binding DataContext.SelectedTypeID, 
                        RelativeSource={RelativeSource Self}}" 
person King King    schedule 30.10.2014