2017-01-31 6 views
0

Я работаю над WPF-приложением, в котором я выполняю проверку с помощью правил IDataErrorInfo и правил проверки. Для отключения кнопки сохранения в то время как все еще есть ошибки данных во время выполнения, я сделал стиль:Может ли стиль отключения кнопки сохранения при выполнении валидации в WPF быть созданным

<!--Disabling the Save-button by style not viewmodel-property--> 
    <Style x:Key="isEnabled_save_button" TargetType="{x:Type Button}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ElementName=tbx_firstname, Path=(Validation.HasError)}" Value="true"> 
       <Setter Property="IsEnabled" Value="False"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding ElementName=tbx_lastname, Path=(Validation.HasError)}" Value="true"> 
       <Setter Property="IsEnabled" Value="False"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding ElementName=tbx_age, Path=(Validation.HasError)}" Value="true"> 
       <Setter Property="IsEnabled" Value="False"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

Это прекрасно работает, но это немного сложнее, потому что я должен проверить каждый элемент управления, который должен подтвердить , Так что я попытался написать общий триггер данных:

<!--Disabling the Save-button by style not viewmodel-property--> 
    <Style x:Key="isEnabled_save_button" TargetType="{x:Type Button}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=(Validation.HasError), RelativeSource={RelativeSource AncestorType=Window}}" Value="True"> 
       <Setter Property="IsEnabled" Value="False"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

Но это не работает. Как я могу сделать его общим?

ответ

1

Прилагаемое свойство Validation.HasError устанавливается индивидуально для каждого элемента, привязанного к исходному свойству, поэтому нет способа сделать некоторые «общие» привязки в стиле Button.

Что вы должны сделать, это привязать свойство IsEnabled Button к свойству вашей модели представления. Это модель представления - класс, который фактически реализует интерфейс IDataErrorInfo, - который должен решить, должна ли кнопка быть включена на основе вашей логики проверки.

<Button IsEnabled="{Binding IsEnabled}" /> 

Если вы реализуете интерфейс INotifyDataErrorInfo, который был представлен в .NET Framework 4.5 можно просто привязать к HasErrors собственности:

<Style TargetType="Button"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding HasErrors}" Value="True"> 
      <Setter Property="IsEnabled" Value="False" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

Существует больше информации и пример того, как можно реализовать этот интерфейс доступен здесь: https://social.technet.microsoft.com/wiki/contents/articles/19490.wpf-4-5-validating-data-in-using-the-inotifydataerrorinfo-interface.aspx

Если вы все еще на .NET 4 или/и решили реализовать старый интерфейс IDataErrorInfo, вы все равно можете добавить приложение HasErrors rty для вашей модели представления, которую вы установили в true/false в соответствии с вашей логикой проверки. Не забудьте поднять интерфейс PropertyChanged, когда вы установите для свойства source новое значение.

+0

Что делать, если проверка не находится в режиме просмотра, а в валидационном классе? –

+0

Затем вы должны ознакомиться с шаблоном проектирования MVVM :) Логика проверки правильности входит в класс модели представления, особенно если вы реализуете интерфейс IDataErrorInfo или INotifyDataErrorInfo. В любом случае нет смысла реализовывать какой-либо из этих интерфейсов. Кроме того, до сих пор нет способа сделать привязку к значению свойства Validation.HasError нескольких разных * элементов * "generic". – mm8

+0

Но в случае, если вы хотите проверить возраст, вы должны использовать класс ValidationRule для проверки того, введен ли пользователь blanck или буквы. Это не поддерживается в viewmodel, где возраст определяется как integer. Вы можете посмотреть мой проект «Validation_IDataErrorInfo2» на странице https://github.com/patrickpirzer/WpfValidation –

Смежные вопросы