Как можно выполнить произвольный код в пользовательском элементе управления, когда изменилось внешнее для него свойство пользовательской зависимости? - PullRequest
0 голосов
/ 19 октября 2011

Мне нужно запустить некоторый пользовательский код в пользовательском элементе управления, когда определенное пользовательское свойство зависимости (определенное в родительском пользовательском элементе управления) изменилось.Каков наилучший способ сделать это в WPF?

Я потратил много времени, играя с триггерами в XAML, которые используют привязку данных для доступа к моему CDP, и нашел решение, которое требует установки промежуточного CDP (в дочернем пользовательском элементе управления), а затем запускаю свой пользовательский код в измененном событии второго CDP.Однако это довольно грязно и не похоже на правильное использование WPF.Кроме того, код, который я запускаю, не имеет прямого отношения к пользовательскому интерфейсу, поэтому XAML здесь не подходит.

Если предположить, что DataContext дочернего пользовательского элемента управления правильно настроен так, что я могу получить доступ к CDP, как я могу написать код для простого выполнения функции обратного вызова при изменении CDP?

У меня уже есть обратный вызов OnXXXChanged в родительском элементе управления высокого уровня, но этот элемент управления ничего не знает о дочернем элементе управления, поэтому он не может легко заставить код выполняться в объекте дочернего элемента управления.

Ответы [ 2 ]

0 голосов
/ 20 октября 2011

Если вы используете MVVM, имейте в виду, что ваше приложение должно быть вашими ViewModel, а не вашими Views

С учетом сказанного, свойство Mode должно быть где-то в ViewModel, и еслиКод PropertyChange не связан с пользовательским интерфейсом, он должен также находиться в вашей ViewModel.

Например, у меня может быть

, тогда как ViewModel может выглядетькак это:

public class MyViewModel : INotifyPropertyChanged
{
    public MyViewModel()
    {
        this.PropertyChanged += MyViewModel_PropertyChanged;
    }

    void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "Mode")
        {
            // Perform some logic here
        }
    }

    private int _mode;
    public int Mode
    {
        get { return _mode; }
        set
        {
            if (value != _mode)
            {
                _mode = value;
                RaisePropertyChanged("Mode");
            }
        }
    }
}
0 голосов
/ 20 октября 2011

Я не уверен, что понял, чего вы хотите достичь, но если проблема заключается в получении еще одного обратного вызова / события для отслеживания изменений в свойстве зависимости (или присоединенном свойстве), тогда это:

Событие присоединенного свойства изменено?

может быть решением.

...