Проблема с привязкой данных ViewModel к свойству зависимости UserControl от UserControl Code-Behind - PullRequest
0 голосов
/ 03 марта 2011

Я пытаюсь привязать свойство IsInInputMode моего ViewModel к свойству зависимости в UserControl.Я устанавливаю DataContext UserControl для экземпляра моей ViewModel, и все мои привязки на основе XAML работают правильно.Мне нужно решение кода для создания этой привязки.Я попробовал несколько вещей (в нижней части поста), которые не работали.

Я не получаю никаких исключений, регистрируемых в окне «Вывод», и это то место, где мне сказали искатьдля привязки на основе исключений.

Я задал этот похожий вопрос о привязке свойства зависимости в UserControl через XAML - мне сказали, что это невозможно, поэтому я ищурешение с выделением кода.

ViewModel выглядит следующим образом:

class AddClientViewModel : ViewModelBase
{
    private Boolean _isInInputMode;
    public Boolean IsInInputMode
    {
        get { return _isInInputMode; }
        set
        {
            _isInInputMode = value;
            OnPropertyChanged("IsInInputMode");
        }
    }

    public ICommand Cancel
    {
        get { return new RelayCommand(parm => { IsInInputMode = false; }); }
    }
}

Команда Cancel успешно привязывает данные к команде кнопки через XAML.

Свойство Dependency в UserControl выглядит следующим образом:

    public bool IsInInputMode
    {
        get { return (bool)GetValue(IsInInputModeProperty); }
        set { SetValue(IsInInputModeProperty, value); }
    }
    public static readonly DependencyProperty IsInInputModeProperty =
        DependencyProperty.Register("IsInInputMode", typeof(bool), typeof(AddClientView), new UIPropertyMetadata(new PropertyChangedCallback(_OnIsInInputModePropertyChanged)));

    private static void _OnIsInInputModePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var mycontrol = d as AddClientView;

        bool oldValue = (bool)e.OldValue;
        bool newValue = (bool)e.NewValue;

        if (null != mycontrol && oldValue != newValue)
        {
            mycontrol._OnIsInInputModeChanged(oldValue, newValue);
        }
    }

    private void _OnIsInInputModeChanged(bool oldValue, bool newValue)
    {
        if (newValue)
        {
            VisualStateManager.GoToState(this, "InputState", false);
        }
        else
        {
            VisualStateManager.GoToState(this, "HiddenState", false);
        }
    }

Привязка в конструкторе моего UserControl прошла несколько итераций.

Первая попытка:

    public AddClientView()
    {
        InitializeComponent();
        SetBinding(IsInInputModeProperty, "IsInInputMode");
    }

Вторая попытка:

    public AddClientView()
    {
        InitializeComponent();

        var b = new Binding();
        b.Source = this.DataContext;
        b.Path = new PropertyPath("IsInInputMode");
        b.Mode = BindingMode.TwoWay;
        b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
        BindingOperations.SetBinding(this, IsInInputModeProperty, b);
    }

Ни одна из этих «неудач» сошибка компилятора или времени выполнения;но когда свойство IsInInputMode изменяется в ViewModel, свойство Dependency никогда не обновляется, а два четных обработчика там никогда не вызываются.

В качестве дополнительного примечания ViewModel имеет несколько ICommand свойств, которые успешно связаны с кнопками в UserControl через XAML - поэтому я правильно знаю привязку DataContext.

Ответы [ 2 ]

0 голосов
/ 07 марта 2011

Оказывается, это была проблема PEBKEC - у меня где-то было установлено значение по умолчанию, поэтому OnNotifyPropertyChanged так и не был вызван, так как казалось, что привязка была нарушена.

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

SetBinding(IsInInputModeProperty, "IsInInputMode");
0 голосов
/ 03 марта 2011

Механизм привязки перехватывает исключения, возникающие в процессе, и показывает их только в окне «Вывод». Вы проверили окно вывода на наличие ошибок?

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