Вы не можете, по крайней мере, не напрямую. Вы можете использовать MultiBinding со всеми желаемыми текстовыми полями в качестве входных данных, но вам нужно будет предоставить IMultiValueConverter для «объединения» различных текстовых полей в один объект (например, список):
<Button>
<Button.DataContext>
<MultiBinding Converter="{StaticResource ListMaker}">
<Binding ElementName="txtEmail" />
<Binding ElementName="txtFirstName" />
<Binding ElementName="txtLastName" />
</MultiBinding>
</Button.DataContext>
</Button>
И именно этот результирующий объект списка будет передан вашему триггеру, так что вы не сможете напрямую получить доступ к свойству Validation.HasError: вашему DataTrigger также понадобится преобразователь, который преобразует объект списка. в логическое значение, указывающее, установлено ли Validation.HasError для чего-либо в списке. На этом этапе вы можете просто забыть о триггерах и связать IsEnabled с помощью MultiBinding:
<Button>
<Button.IsEnabled>
<MultiBinding Converter="{StaticResource AllFalse}">
<Binding Path="(Validation.HasError)" ElementName="txtEmail" />
<Binding Path="(Validation.HasError)" ElementName="txtFirstName" />
<Binding Path="(Validation.HasError)" ElementName="txtLastName" />
</MultiBinding>
</Button.DataContext>
</Button>
(Здесь преобразователь AllFalse возвращает значение true, если все входные данные имеют значение false, и значение false, если любой вход имеет значение true.)
Однако лучший подход может заключаться в том, чтобы вместо привязки Button непосредственно к другим элементам пользовательского интерфейса иметь ваш объект данных - тот же объект, к которому привязаны ваши текстовые поля - предоставить свойство IsValid (с подходящими уведомлениями об изменениях). ), и привяжите свою кнопку к этому:
<Button IsEnabled="{Binding IsValid}" />
Это перемещает вас к решению в стиле MVVM, которое помогает с такими вещами, как тестируемость (например, легко создавать тесты для свойства IsValid; гораздо сложнее создавать тесты для Button.IsEnabled).