Как обновить окно wpf c
Перейти к содержимому

Как обновить окно wpf c

  • автор:

Свойство UpdateSourceTrigger

В предыдущей статье мы увидели, как изменения текста в элементе TextBox не повлекло немедленного соответствующего изменения в источнике данных. Вместо этого источник данных обновился только после того, как элемент TextBox потерял фокус. Такое поведение контролируется свойством под названием UpdateSourceTrigger при связывании целевого свойства и источника. По умолчанию это свойство имеет значение «Default», которое означает, что изменение источника будет зависеть от целевого свойства от которого идет привязка. На момент написания этой статьи, все свойства, исключая свойство Text, будут немедленно обновлены при изменении источника данных, в то время как свойство Text изменится лишь при потере фокуса элементом управления.

«Default» является значением по умолчанию свойства UpdateSourceTrigger. Другими значениями могут быть PropertyChanged, LostFocus и Explicit. Первые два уже были описаны, последнее означает, что обновление источника произойдет только при вызове метода UpdateSource().

Чтобы показать как эти опции работают я обновил пример из предыдущей главы.

    " Width="150" />    " Width="50" /> " Width="50" />  
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Data; namespace WpfTutorialSamples.DataBinding < public partial class DataContextSample : Window < public DataContextSample() < InitializeComponent(); this.DataContext = this; >private void btnUpdateSource_Click(object sender, RoutedEventArgs e) < BindingExpression binding = txtWindowTitle.GetBindingExpression(TextBox.TextProperty); binding.UpdateSource(); >> >

Как вы видите, три элемента управления TextBox используют различные значения свойства UpdateSourceTrigger.

В первом случае используется значение Explicit, которое означает, что обновление источника не произойдет пока вы «вручную» не обновите его. Для этого случая я добавил кнопку следом за элементом TextBox, которая обновляет источник при нажатии. В исходниках вы можете найти обработчик события нажатия кнопки, где несколько строк кода используются для получения объекта типа BindingExpression и вызова метода UpdateSource() этого объекта.

Второй TextBox использует значение LostFocus, которое является значением по умолчанию при связывании свойства Text с источником. Это означает, что источник будет обновляться каждый раз, когда целевой элемент управления потеряет фокус.

В последнем третьем TextBox используется значение PropertyChanged, которое означает, что изменение источника произойдет всякий раз при изменении целевого свойства. В нашем случае при изменении текста в TextBox.

Попробуйте запустить пример на вашей машине и посмотрите, как по-разному работают TextBox при изменении текста. В первом случае значение не изменится пока вы не нажмете кнопку, во втором случае значение не изменится пока TextBox не потеряет фокус управления, в третьем случае значение изменится сразу же при изменении текста.

Заключение

Свойство UpdateSourceTrigger контролирует, как и когда изменения в целевом свойстве спровоцируют изменения в источнике. Однако, в большинстве случаев, значение по умолчанию этого свойства является лучшим выбором соотношения обновления пользовательского интерфейса и производительности.

Для тех ситуаций, когда вам нужно контролировать этот процесс, это свойство достаточно полезно. Только будьте уверены в том, что вы не обновляете источник привязки чаще, чем того требуется. Для получения полного контроля можно использовать значение Explicit и затем обновлять источник данных вручную, но это достаточно утомительно при работе со связыванием данных.

This article has been fully translated into the following languages:

Is your preferred language not on the list? Click here to help us translate this article into your language!

Как обновить окно в WPF?

У меня есть Request.xaml файл где есть мно-во и TextBox-ы Combox-ов и кнопка, так вот мне нужно при нажатии ее чтобы текст в TextBox-ах вернулся в дэфолтное состояние. Мне нужно это реализовать, чтобы пользователь мог опять ввести данные туда, а я при этом при нажатии кнопки еще и сохранил эти данные. Еще повторю вопрос как или обновить окно, или во все Combox-ах вернуть дефолтное значения.

page.DataContext = null; page.DataContext = new Foo(); 

Отслеживать
задан 19 ноя 2013 в 20:19
33 1 1 серебряный знак 3 3 бронзовых знака

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Во-первых, вы путаете визуальное состояние с логическим. Визуальное состояние «обновлять» не надо: WPF рисует всё правильно за вас, UI всегда в правильном состоянии без вашего участия.

Что вы хотите, так это вернуть начальные значения полей.

Если вы пишете на WPF как на WinForms, без MVVM/ DataContext , и реализуете логику в code behind — вы ССЗБ, ничего иного, чем просто ручное присвоение полям фиксированных значений в code behind по нажатию кнопки вы сделать не можете.

Если же вы модный чувак и ваши данные приходят к вам через Binding / DataContext , то совет переподключить этот самый DataContext как раз правильный и должен сработать.

Обновление привязок

В примере из предыдущей статьи (где TextBox.Text привязывается к TextBlock.FontSize) имеется еще один нюанс. При попытке изменить отображаемый размер шрифта, вводя значение в текстовое поле, ничего не происходит. Изменение не применяется до тех пор, пока не будет совершен переход на другой элемент. Это поведение отличается от поведения, которое демонстрировалось в примере с ползунком. Там новый размер шрифта применялся после перетаскивания ползунка в другую позицию, т.е. в переходе на другой элемент вообще не было необходимости.

Чтобы понять это различие, следует повнимательнее присмотреться к выражениям привязки, которые используются этими двумя элементами управления. Когда применяется привязка OneWay или TwoWay, измененное значение распространяется от источника к цели немедленно. В случае с ползунком есть однонаправленное выражение привязки в TextBlock. Таким образом, изменения в свойстве Slider.Value немедленно отражаются в свойстве TextBlock.FontSize. То же поведение имеет место в примере с текстовым полем: изменения в источнике (которым является TextBlock.FontSize) немедленно влияют на цель (TextBox.Text).

Однако изменения, протекающие в обратном направлении — от цели к источнику — не обязательно происходят немедленно. Вместо этого их поведение управляется свойством Binding.UpdateSourceTrigger, которое принимает одно из значений, описанных ниже. Когда текст берется из текстового поля и используется для обновления свойства TextBlock.FontSize, это пример обновления цель-источник, которое использует поведение UpdateSourceTrigger.LostFocus.

PropertyChanged

Источник обновляется немедленно, когда изменяется целевое свойство

LostFocus

Источник обновляется немедленно, когда изменяется целевое свойство и цель теряет фокус

Explicit

Источник не обновляется, пока не будет вызван метод BindingExpression.UpdateSource()

Default

Поведение обновления определяется метаданными целевого свойства (формально — его свойства FrameworkPropertyMetadata.DefaultUpdateSourceTrigger). Для большинства свойств поведением по умолчанию будет PropertyChanged, хотя свойство TextBox.Text обладает поведением по умолчанию LostFocus

Помните, что эти значения не оказывают эффекта на обновление цели. Они просто управляют тем, как обновляется источник в привязках TwoWay и OneWayToSource.

Вооружившись этим знанием, можно усовершенствовать пример с текстовым полем, чтобы изменения применялись к размеру шрифта по мере их ввода в текстовое поле:

Автоматическое обновление привязки

Поведением по умолчанию свойства TextBox.Text является LostFocus просто потому, что текст в текстовом поле будет изменяться непрерывно в процессе пользовательского ввода, вызывая множественные обновления. В зависимости от того, как исходный элемент управления обновляет себя, режим обновления PropertyChanged может сделать приложение более медлительным. Вдобавок это может заставить исходный объект обновлять себя до завершения редактирования, что создаст проблемы при проверке достоверности.

Для полного контроля над моментом обновления исходного объекта можно выбрать режим UpdateSourceTrigger.Explicit. Если воспользоваться этим подходом в примере с текстовым полем, то когда текстовое поле утратит фокус, ничего не произойдет.

Вместо этого код должен будет вручную инициировать обновление. Например, можно было бы добавить кнопку Add (Добавить), которая вызовет метод BindingExpression.UpdateSource(), инициируя немедленное обновление размера шрифта. Разумеется, прежде чем можно будет вызвать метод BindingExpression.UpdateSource(), нужен способ получения объекта BindingExpression. Объект BindingExpression — это тонкая упаковка, которая содержит в себе две вещи: уже известный объект Binding (предоставленный через свойство BindingExpression.ParentBinding) и объект, привязанный от источника (BindingExpression.DataItem).

Вдобавок объект BindingExpression предоставляет два метода для запуска немедленного обновления одной части привязки: UpdateSource() и UpdateTarget().

Для получения объекта BindingExpression используется метод GetBindingExpression(), унаследованный каждым элементом от базового класса FrameworkElement, которому передается целевое свойство, имеющее привязку.

Как обновить окно в WPF?

У меня есть Request.xaml файл где есть мно-во и TextBox-ы Combox-ов и кнопка, так вот мне нужно при нажатии ее чтобы текст в TextBox-ах вернулся в дэфолтное состояние. Мне нужно это реализовать, чтобы пользователь мог опять ввести данные туда, а я при этом при нажатии кнопки еще и сохранил эти данные.

Еще повторю вопрос как или обновить окно, или во все Combox-ах вернуть дефолтное значения.

Тут мне предлогали

page.DataContext = null; page.DataContext = new Foo();

Но я не понял, что это. Несколько подробнее вопрос описан тут http://stackoverflow.com/quest. age-in-wpf

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как обновить окно
В общем у меня есть приложение в нем есть кнопка "обновить", а как сделать чтобы я не нажимал на.

Как обновить окно
как обновить данные в окне формы, если данные в таблице, которая отображает форма обновились

Как обновить дочернее окно?
Доброго времени суток! Как обновить (перерисовать) дочернее окно? LRESULT CALLBACK.

Как обновить окно на ASP.NET?
Проект ASP.NET Есть страница с ссылками. При нажатии на ссылку, открывается отдельное окно для.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *