DataTrigger сделает кнопку WPF неактивной до тех пор, пока TextBox не будет иметь значение

Я хочу, чтобы свойство управления Button было IsEnabled="False", пока значение не будет введено в TextBox в Window.

Код:

<button content="Click Me" name="ClickMe" verticalalignment="Top" click="ClickMe_Click">
 <button.style>
 
 </button.style>
</button>

Кроме того, возможно ли, чтобы это свойство Button control IsEnabled было основано на 3 разных элементах управления TextBox, все из которых имеют значения?

3 ответа

Предполагая, что вы используете модель представления, такую ​​как ViewModel, вы должны привязывать непосредственно данные вместо элементов пользовательского интерфейса.

<style.triggers>
 <multidatatrigger>
 <multidatatrigger.conditions>
 <condition binding="{Binding FirstName}" value="{x:Null}">
 <condition binding="{Binding MiddleName}" value="{x:Null}">
 <condition binding="{Binding LastName}" value="{x:Null}">
 </condition></condition></condition></multidatatrigger.conditions>
 <setter property="Button.IsEnabled" value="False">
 </setter></multidatatrigger>
</style.triggers>

Тем не менее, если вы используете модель презентации, вы всегда можете добавить свойство bool "EnableSave" и обрабатывать всю логику представления там, а не в самом представлении.

Обновление

Как видно из комментариев, я ошибочно установил это, чтобы включить Button, когда у любого TextBox есть значение, но требование состоит в том, чтобы Button было включено, когда все TextBox es имеют значения.

Концептуально все, что вам нужно сделать, это изменить условия - вместо "false, если все условия ложны", мы хотим "true, если все условия истинны".

Ловушка заключается в том, что нет способа сказать "не null" в XAML - никоим образом без IValueConverter, то есть. Я создал бы NullToBoolConverter, который возвращает false для null и true для != null.

Для такого преобразователя:

<style.triggers>
 <multidatatrigger>
 <multidatatrigger.conditions>
 <condition binding="{Binding FirstName,
 Converter={StaticResource NullToBoolConverter}}" value="True">
 <condition binding="{Binding MiddleName,
 Converter={StaticResource NullToBoolConverter}}" value="True">
 <condition binding="{Binding LastName,
 Converter={StaticResource NullToBoolConverter}}" value="True">
 </condition></condition></condition></multidatatrigger.conditions>
 <setter property="Button.IsEnabled" value="True">
 </setter></multidatatrigger>
</style.triggers>


TextBox не имеет свойства Length. Установка пути привязки к Text.Length может работать.

Но более гибким решением было бы использовать Converter, который может возвращать true или false в зависимости от значения строки перешел в него. Затем вы можете привязать свойство TextBox Text так:

В вашем распоряжении Ресурсы:

Ваше определение DataTrigger выглядит следующим образом:

Что касается второго запроса, вы можете использовать MultiBinding. В этом случае вы должны использовать преобразователь значений, чтобы определить, как интерпретировать результаты привязки. Подробнее см. Связанный учебник.


Используя свойство x: Name= "FirstName" и аналогично для других, следующий код будет работать, чтобы включить кнопку, когда данные присутствуют во всех полях.

<button.style>
 
 </button.style>

licensed under cc by-sa 3.0 with attribution.