Как связать несколько вложенных свойств в WPF - PullRequest
0 голосов
/ 05 июня 2018

Вот моя проблема, у меня следующая структура данных:

public class Job : INotifyPropertyChanged {
    public StateEnum State {
        get { return this.state; }

        private set {
            this.state = value;
            this.OnPropertyChanged();
        }
    }
}

public class MainWindow : Window, INotifyPropertyChanged 
    public List<Job> Jobs {
        get { return this.jobs; }

        private set {
            this.jobs = value;
            this.OnPropertyChanged();
        }
    }
}

Я хочу отобразить сводную информацию о состоянии работ в главном окне.

Сначала я попыталсясоздайте привязку данных в списке заданий, а затем используйте пользовательский IValueConverter для отображения глобального состояния.Проблема: она не обновляется при изменении состояний задания (поскольку оно связано с коллекцией, а не с состояниями).

ProgressState="{Binding Jobs, Converter={StaticResource JobsToProgressState}, ElementName=MainWindow}"

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

Возможно ли сделать что-то подобное?

РЕДАКТИРОВАТЬ: Я хочу сделать что-то вроде

ProgressState="{Binding Jobs[*].State, Converter={StaticResource JobsToProgressState}, ElementName=MainWindow}"

И получить массив, содержащий все состояния задания (StateEnum [] ) в конвертере JobsToProgressState.

1 Ответ

0 голосов
/ 05 июня 2018

Проблема в том, что OnPropertyChanged не запускается при изменении записи IList.Вам необходимо делегировать OnPropertyChanged из Job до вашего Jobs -списка.

Эта грубая реализация будет делать то, что вы хотите.

public class Job : INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged; 
    public StateEnum State {
        get { return this.state; }

        private set {
            this.state = value;
            this.OnPropertyChanged();
        }
    }
}

public class MainWindow : Window, INotifyPropertyChanged 
    public List<Job> Jobs {
        get { return this.jobs; }

        private set {
            this.jobs = value;

            foreach(var job in this.jobs)
            {
                job.PropertyChanged += job_PropertyChanged;
            }
        }
    }

    private void job_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        this.OnPropertyChanged("Jobs");
    }
}

Не забудьте отключить регистрацию событий, когда они вам больше не нужны.

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