Привязка данных / PropertyChanged равна нулю - PullRequest
1 голос
/ 25 января 2012

Хорошо, я потерян. Со вчерашнего дня я ищу, почему моя привязка данных не работает, как ожидалось. Поскольку я новичок в WPF, а также в MVVM, было бы понятно, если бы я не использовал тот же подход в том же проекте с 2 другими видами.

Необходимая конфигурация состоит в том, что у меня есть 3 представления, для всех из них я установил DataContext в конструкторе MainWindows на ответственный ViewModel.

Сама модель представления не реализует IPropertyChanged, но модель имеет несколько вложенных объектов, которые делают.

Я связываю со следующим XAML:

<TextBox Grid.Column="1" Grid.Row="0" Margin="1">
                <TextBox.Text>
                    <Binding Path="Model.InsertLine.Destination.Value" UpdateSourceTrigger="PropertyChanged">
                        <Binding.ValidationRules>
                            <local:MinMaxLengthValidatonRule Min="7" Max="7"/>
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>

InsertLine имеет свойствоChanged:

    public TLTMoveULLine InsertLine
    {
        get { return _insertline; }
        internal set
        {
            _insertline = value;
            if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("InsertLine"));
        }
    }

Общая привязка к Destination и Unit works. Как и проверка.

Однако в определенный момент я устанавливаю новую строку вставки после того, как она была вставлена ​​в коллекцию ObeservableCollection (_document.Lines). Я ожидаю, что произойдет (и что происходит в двух других представлениях), что текстовое поле будет очищено.

    public void AddLine()
    {
        _document.Lines.Add(InsertLine);
        TLTMoveULLine newline = new TLTMoveULLine();

        newline.Destination.Value = InsertLine.Destination.Value;
        newline.Unit.Value = "";

        InsertLine = newline;
    }

Свойство в GetLine вызывается, однако делегат PropertyChanged имеет значение null.

У кого-нибудь есть идея, почему он нулевой? Тот же подход работает с 2 отдельными видами, но не с этим ...

Или у меня неправильное представление, и есть лучший способ сделать это?

Ответы [ 2 ]

7 голосов
/ 26 января 2012

Хорошо, я нашел это. И это было абсолютно глупое упущение.

Для всех, у кого есть эта проблема: Убедитесь, что у вас есть не только событие PropertyChanged и вы его вызываете, вы также должны наследовать от интерфейса. Я просто забыл поставить INotifyPropertyChanged после определения модели.

Что приводит меня к вопросу из любопытства: Я всегда думал, что интерфейс - это не что иное, как контракт, по сути, он не должен иметь никакого значения, но я предполагаю, что WPF использует оператор отражения / is-operator, чтобы выяснить, можно ли связать объект. Я там примерно на правильном пути?

0 голосов
/ 05 декабря 2013

На всякий случай: у меня была похожая проблема, но моя ошибка была в том, что класс, в котором реализован INotifyPropertyChanged, был закрытым.Обнародование разрешило мое дело.

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