Почему PropertyChangedEventHandler имеет значение null? - PullRequest
0 голосов
/ 21 января 2012

Главная страница:

MainPage.xaml

<Canvas x:Name="LayoutRoot" Background="White">
</Canvas>

MainPage.xaml.cs

List<Usol> list = new List<Usol>();
for (int i = 0; i < 10; i++)
{
    var element = new Usol();
    list.Add(element);
    Canvas.SetTop(element, i * 25);
    LayoutRoot.Children.Add(list[i]);
    }
foreach (var item in list)
{
    item.context.name = "Varken";
}

Пользовательский контроль

Usol.xaml

<Grid x:Name="LayoutRoot" Background="White">
    <TextBlock Text="{Binding Name}" />
</Grid>

Usol.xaml.cs

 public Context context;
 public Usol()
 {
     InitializeComponent();
     context = new Context();
     this.DataContext = context;
 }

A класс

Context.cs

public class Context : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }       
    #region Fields
    /// <summary>
    /// Field Declaration for the <see cref="Name"/>
    /// </summary>
    private string name;
    #endregion
    #region Properties
    /// <summary>
    /// Gets or Sets the Name
    /// </summary>
    public string Name
    {
        get { return name; }
        set
        {
            if (this.name != value)
            {
                this.name = value;
                OnPropertyChanged("Name");
            }
        }
    }
    #endregion
}

Ситуация

Я создал это небольшое тестовое приложение, чтобы скопировать проблему, возникшую вбольшее приложение.Он работает примерно так же (не совсем, но достаточно близко).

Он добавляет несколько пользовательских контролов, и каждый получает собственный экземпляр класса datacontext.

Однако ни одно из свойствготовы обновить себя из-за пустого PropertyChangedEventHandler.

Вопрос

Почему public event PropertyChangedEventHandler PropertyChanged; всегда равно нулю?

Ответы [ 2 ]

2 голосов
/ 21 января 2012

Context.cs должен реализовать интерфейс INotifyPropertyChanged. Вы это делаете?

Редактировать: опубликовать обновление.

Обычно я сталкивался с такой проблемой, когда программисты создают «два» экземпляра Model / ViewModel. В то время как вы присоединяете один экземпляр с помощью View, всегда обновляется другой (который, конечно, будет иметь нулевых подписчиков PropertyChanged). Таким образом, вы должны убедиться, что ваше представление использует тот же экземпляр, что и обновление в других частях. Надеюсь, моя точка зрения ясна.

1 голос
/ 21 января 2012

Ваш код неверен,

OnPropertyChanged("Name"); <-- should update "name" not "Name"

Вы запускаете событие, сообщающее, что «Имя» изменено, но имя свойства равно «имя», C # и привязка чувствительны к регистру.

Измените его на

#region Fields
/// <summary>
/// Field Declaration for the <see cref="name"/>
/// </summary>
private string _Name;
#endregion
#region Properties
/// <summary>
/// Gets or Sets the name
/// </summary>
public string Name
{
    get { return _Name; }
    set
    {
        if (this._Name != value)
        {
            this._Name = value;
            OnPropertyChanged("Name");
        }
    }
}
#endregion

Начиная с C # 6 на палатах, используйте ключевое слово nameof() ...

#region Fields
/// <summary>
/// Field Declaration for the <see cref="name"/>
/// </summary>
private string _Name;
#endregion
#region Properties
/// <summary>
/// Gets or Sets the name
/// </summary>
public string Name
{
    get { return _Name; }
    set
    {
        if (this._Name != value)
        {
            this._Name = value;
            OnPropertyChanged(nameof(Name));
        }
    }
}
#endregion
...