Кнопка "Сделать" включена/отключена в зависимости от свойства TextBox Text в WPF?
Я искал код через google, который включает и отключает кнопку на основе свойства text из текстового поля. Если текстовое поле имеет некоторый текст, тогда кнопка должна быть включена или иначе кнопка должна быть отключена.
Я получил код, но код в xaml, но не С#. Я не могу понять, как это работает.
Пожалуйста, помогите мне понять поведение следующего кода:
<TextBox Name="txtName" Width="100" Height="30"></TextBox>
<Button Content="Add Name " Width="100" Height="30"
IsEnabled="{Binding ElementName=txtName, Path=Text.Length, Mode=OneWay}"/>
Как работает свойство кнопки IsEnabled? Как установлено значение true и false для свойства IsEnabled? Что такое Путь? Как это работает?
Ответы
Ответ 1
Эта статья статья и статья объясняет привязки данных WPF и как работают пути.
Но привязка выше будет наблюдать свойство Text в TextBox для изменений. Затем он будет смотреть свойство Length на значение, возвращаемое из свойства Text, которое является строкой. Значение свойства Length передается в свойство IsEnbled.
Значение также должно быть преобразовано, так как вы назначаете Int32 (свойство Length) логическому (свойство IsEnabled). Обычно это делается с помощью преобразователей типов, поэтому приведенные выше работы (что меня удивляет).
UPDATE:
Первая ссылка выше больше не работает, поскольку статьи MSDN Magazine старше 2008 года больше не доступны в Интернете. Однако они доступны как файлы CHM. Ссылка CHM для связанной статьи под названием "Точки данных: привязка данных в WPF":
http://download.microsoft.com/download/3/a/7/3a7fa450-1f33-41f7-9e6d-3aa95b5a6aea/MSDNMagazine2007_12en-us.chm
Из MSDN:
2008 и более старые проблемы доступны только как .chm файлы. В большинстве версий окон вы должны сначала сохранить эти файлы на свой локальный компьютер, а затем разблокировать файл, чтобы его прочитать. Чтобы разблокировать файл, щелкните его правой кнопкой мыши и выберите свойства, а затем нажмите кнопку "разблокировать". Содержимое будет доступно для чтения.
Ответ 2
См. этот пост для примера того, как отключить Button
на основе содержимого TextBox
.
Хотя этот подход будет работать, лучше использовать ICommand
.
В ответ на комментарии
ElementName
= имя элемента управления в XAML, к которому мы привязаны. Таким образом, приведенный ниже пример будет {Binding ElementName=aName}
<TextBox x:Name="aName" />
Path
= путь свойства значения, которое вы хотите для этого элемента. Например, если вы хотите получить значение свойства Text, вы должны использовать {Binding Path=Text}
. Если вы хотите получить длину свойства Text, вы используете {Binding Path.Text.Length}
и т.д.
Mode=OneWay
= направление, в котором оценивается привязка. Это объясняется здесь
Ответ 3
Добавьте свойство в модель вашего представления, которое вычисляет значение IsEnabled и привязывается к нему.
В настройщике для свойства, которое вы привязали к значению TextBox.Text, вы также запускаете измененное событие для свойства IsEnabled.
Ответ 4
Если вы не хотите использовать MVVM/привязку данных, вы можете:
-
Вы можете добавить DataTrigger в стиль TextBox и отключить/включить его.
-
Или привяжите свойство IsEnabled свойства Button к тексту TextBox и используйте конвертер значений, чтобы включить длину строки в логическое значение.
Ответ 5
это новый синтаксис Binding в WPF (xaml).
- Вы привязываетесь к txtName TextBox control/element
- Вы используете
Path
для указания того, какое свойство элемента u r пытается связать. в этом случае вы привязываетесь к свойству TextBox Text, а затем к атрибуту Text Length.
Итак, когда текстовое поле пуст. TextBox.Text.Length = 0, что означает, что он будет отключен.
как только вы введете какое-либо значение, это becames >= 0, которое переводится в true.
Я бы настоятельно рекомендовал прочитать о Binding в WPF, прежде чем пытаться закодировать. В WPF это совсем другое, чем WinForm