Как я могу изменить UIElement при изменении свойства ie? - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь сделать действительно простое приложение для изучения DataBinding и событий. Следующий код должен изменять содержимое метки, когда я нажимаю на кнопку, но на самом деле он меняет свойство, но не обновляет метку.

Это основной код:

public MainWindow()
    {
        InitializeComponent();

        environments = new ObservableCollection<Env>();

        environments.Add(new Env("env1", new ObservableCollection<Cell>()));
        environments.Add(new Env("env2", new ObservableCollection<Cell>()));

        foreach (Env e in environments)
        {
            Label label = new Label
            {
                Content = e.Name
            };

            pnlMain.Children.Add(label);  
        }
    }

    private void ChangeEnvName_Click(object sender, RoutedEventArgs e)
    {
        foreach (Env env in environments)
        {
            env.Name = "test"; 
        }
    }

А это класс Env:

class Env : INotifyPropertyChanged
{
    //membres
    #region membres
    private string _name;
    private ObservableCollection<Cell> _cells;


    #endregion

    //propriétés
    #region propriétés
    public string Name
    {
        get { return this._name; }
        set
        {
            if (this._name != value)
            {
                this._name = value;
                this.NotifyPropertyChanged("Name");
            }
        }
    }
    public ObservableCollection<Cell> Cells
    {
        get { return this._cells; }
        set
        {
            if (this._cells != value)
            {
                this._cells = value;
                this.NotifyPropertyChanged("Cells");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion


    //méthodes
    #region méthodes
    public void NotifyPropertyChanged(string propName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
    #endregion

    //constructeur
    #region contructeur
    public Env(string name, ObservableCollection<Cell> cells)
    {
        _name = name;
        _cells = cells;
    }
    #endregion
}

В чем проблема? Разве это не предполагает обновление label.content при обновлении Env.Name?

1 Ответ

1 голос
/ 30 января 2020

Вы не связали свойство Content Label со свойством Name. Вы только что установили его на string. Попробуйте это:

foreach (Env e in environments)
{
    Label label = new Label();
    label.SetBinding(Label.ContentProperty, new Binding("Name") { Source = e });
    pnlMain.Children.Add(label);
}

Или создайте свойство Environments, которое возвращает environments, установите DataContext в this и привязайте к Environments[index].Name. Если вы не укажете явную Source привязки, она будет искать свойство в его текущей DataContext, которое может быть унаследовано от родительского элемента. Пожалуйста, смотрите документы для получения дополнительной информации.

...