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

Взгляните на этот простой пример

lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("Subtotal"), Source = Order, Mode = BindingMode.OneWay });
lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("FinalTotal"), Source = Order, Mode = BindingMode.OneWay });

При изменении FinalTotal текст lblTotal НЕ будет изменен.

Теперь закомментировал первую строку.

//lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("Subtotal"), Source = Order, Mode = BindingMode.OneWay });
lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("FinalTotal"), Source = Order, Mode = BindingMode.OneWay });

ТЕПЕРЬ ЭТО РАБОТАЕТ !!!! Изменение FinalTotal изменит текст lblTotal! Есть идеи, почему?

Кроме того, BindingOperations.ClearBinding () недоступен в UWP. Итак, я попытался заменить его пустой привязкой, но он все еще не работает.

lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("Subtotal"), Source = Order, Mode = BindingMode.OneWay });

//remove binding - not sure if this is correct way to remove binding because
//BindingOperations.ClearBinding() isn't available in UWP!
BindingOperations.SetBinding(lblTotal, TextBlock.TextProperty, new Binding());

lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("FinalTotal"), Source = Order, Mode = BindingMode.OneWay });

Мои вопросы: 1. Как заменить привязку в UWP? 2. Как удалить существующую привязку в UWP (т.е. функцию, эквивалентную BindingOperations.ClearBinding () )?

Спасибо за любую помощь ...

2
Sam 23 Дек 2016 в 13:57
Просто вопрос - можно ли изменить BindingMode на TwoWay?
 – 
Sasha
23 Дек 2016 в 14:52
Привет, Саша, я пробовал это, но все еще не работает :(
 – 
Sam
23 Дек 2016 в 16:02
Должна быть ошибка установки привязок для «Промежуточного итога». В окне вывода отображаются ошибки привязки?
 – 
Sasha
23 Дек 2016 в 16:19
Привет, Саша, на промежуточных итогах ошибок нет. Моя текущая работа - создать два TextBlocks. Один для промежуточного итога, а другой для итогового итога. Попробуйте создать простой проект, и вы сможете воспроизвести эту проблему.
 – 
Sam
23 Дек 2016 в 19:12
Могло ли быть выброшено какое-то исключение в первой строке?
 – 
Alexej Sommer
29 Дек 2016 в 14:52

1 ответ

Лучший ответ

Как объявлено в методе FrameworkElement.SetBinding:

Примечание . Вызов метода SetBinding и передача нового Привязка не обязательно удалит существующую привязку. Вместо этого вы должны сначала вызвать DependencyObject.ClearValue , затем вызовите SetBinding .

Таким образом, вы можете изменить свой код следующим образом:

lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("Subtotal"), Source = Order, Mode = BindingMode.OneWay });
lblTotal.ClearValue(TextBlock.TextProperty);
lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("FinalTotal"), Source = Order, Mode = BindingMode.OneWay });

После этого ваш код должен заработать. Для получения дополнительной информации см. Примечания к FrameworkElement.SetBinding, а также BindingOperations.SetBinding .

6
Jay Zuo 27 Дек 2016 в 10:44
Спасибо, Джей, я не тестировал этот код, но выглядит нормально. Попробую, когда вернусь к работе, и сообщу, если возникнут проблемы!
 – 
Sam
31 Дек 2016 в 00:57