Привязка при нажатии кнопки (явная привязка) всегда имеет значение BindingExpression, равное нулю?

2

У меня есть текстовое поле, которое содержит строку, которая должна быть привязана только тогда, когда пользователь нажимает кнопку. В XAML:

<Button Command="{Binding Path=PingCommand}" Click="Button_Click">Go</Button>
<TextBox x:Name="txtUrl" Text="{Binding Path=Url,UpdateSourceTrigger=Explicit, Mode=OneWay}" />

В коде:

private void Button_Click(object sender, RoutedEventArgs e)
{  
    BindingExpression be = this.txtUrl.GetBindingExpression(TextBox.TextProperty);
    be.UpdateTarget();
}

"be" всегда равно NULL. Почему?

Update:

Хорошо, вот некоторые обновления после многих попыток.

IF, я устанавливаю режим OneWay с явным обновлением. У меня есть исключение NullReferenceException в объекте be be из выражения GetBindingExpression.

ЕСЛИ, я устанавливаю режим на ничего (по умолчанию TwoWay) с явным обновлением. У меня есть привязка, получающая значение (string.empty), и каждый раз стирает все в текстовом поле.

IF, я устанавливаю режим OneWay с PropertyChanged. Я ничего не вызвал связанным с ним свойством, когда я нажимаю клавиши в текстовом поле, и как только я нажимаю кнопку, у меня есть исключение NULLReferenceException в объекте be be.

IF, я устанавливаю режим в ничто (по умолчанию TwoWay), с PropertyChanged У меня есть свойство, которое поднимается каждый раз, когда я нажимаю (GOOD), но я не хочу, чтобы изменение свойства каждый раз, когда пользователь нажимал клавишу... но только когда пользователь нажимает кнопку.

  • 0
    быть не нуль для меня ...
  • 0
    Не первый раз, когда я нажимаю кнопку. Второй раз это так. Я не удаляю привязку явно, поэтому я сбит с толку, если какое-то поведение может удалить привязку, которую я мог бы не знать.
Показать ещё 4 комментария
Теги:
wpf
binding

3 ответа

7
Лучший ответ

Хорошо, подумав немного больше, я заметил, что:

 BindingExpression be = this.txtUrl.GetBindingExpression(TextBox.TextProperty);
 be.UpdateTarget();

Имеет что-то нелогичное, потому что я не хочу обновлять Target, но источник. Я просто изменил be.Updatetarget(), чтобы be.UpdateSource(); и все это с XAML:

 <TextBox x:Name="txtUrl" Text="{Binding Path=Url, UpdateSourceTrigger=Explicit}">...

Спасибо всем, кто помог мне в решении этой проблемы. Я добавил +1 всем! Благодаря

  • 0
    +1, так как интересно, что явные привязки обновлений позволяют вам указать направление обновления на лету. Я предполагаю, что простое «обновление» в случае TwoWay, когда изменились и источник, и цель, приведет к неизвестным результатам. Хорошие вещи, чтобы знать.
1

Вы пробовали привязку данных без UpdateSourceTrigger? Если привязка не удалась, я ожидал бы, что null будет результатом GetBindingExpression.

Одной из причин этого может быть то, что Url не был реализован как DependencyProperty.

  • 0
    Url не является DependencyProperty. Должно ли это быть?
  • 0
    Да, есть большая вероятность, что это решит вашу проблему.
Показать ещё 5 комментариев
1

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

  • 0
    Я проверю, присваивается ли где-то в коде значение, но я сомневаюсь в этом, потому что это дизайн с привязкой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню