2016-10-05 3 views
0

Я пытаюсь реализовать замещающий текст для PasswordBox по следующему коду:DataTrigger на TextBlock не работает, как ожидалось

<PasswordBox x:Name="passwordText"/> 
<TextBlock IsHitTestVisible="False" Text="Password"> 
    <TextBlock.Style> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Password, ElementName=passwordText}" Value=""> 
        <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 

Вот результат:

enter image description here

Итак, есть ли что-то неправильно с кодом выше?

BTW, я попробовал его с TextBox вместо PasswordBox, и он работал так, как ожидалось.

ответ

0

Как упоминалось @Anjum. Password Недвижимость в PasswordBox не является зависимым имуществом по некоторым соображениям безопасности. Поэтому он не будет уведомлять об изменениях в Trigger.

Вид обходного будет

<Window.Resources> 
    <Style TargetType="{x:Type PasswordBox}" xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
     <Style.Resources> 
      <VisualBrush x:Key="CueBannerBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None"> 
       <VisualBrush.Visual> 
        <Label Content="Password" Foreground="LightGray"/> 
       </VisualBrush.Visual> 
      </VisualBrush> 
     </Style.Resources> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=Password}" Value="{x:Null}"> 
       <Setter Property="Background" Value="{StaticResource CueBannerBrush}" /> 
      </DataTrigger> 

      <Trigger Property="IsKeyboardFocused" Value="True"> 
       <Setter Property="Background" Value="White" /> 
      </Trigger> 
     </Style.Triggers> 
     <Setter Property="Control.Foreground" Value="#4C2C66"/> 
     <Setter Property="VerticalAlignment" Value="Center"/> 
    </Style> 
</Window.Resources> 

<PasswordBox Width="200" Height="75" /> 

Источник:

https://stackoverflow.com/a/20342141/2819451

https://stackoverflow.com/a/27167280/2819451

+0

Спасибо, это «вид» работает. Но не эта строка: 'Binding =" {Binding Path = Password} "' используется свойство 'Password' в Trigger? – Zolbayar

+0

@ZolbayarBayarsaikhan Извините. Фактически, он не будет уведомлять об изменениях. – Gopichandar

0

EDIT # 1

После пользователя Clemens комментарий, я исправил язык моего ответа.

С Password с нами не существует никаких уведомлений о изменении правил, поэтому они не работают. Password Недвижимость не DP.

Вы должны использовать простой метод обработчиков событий. Используйте событие PasswordBox.PasswordChanged.

+0

Существует нет привязки ** к ** свойство Password. Пароль является исходным свойством Binding и, следовательно, не должен быть свойством зависимостей. Однако, поскольку он не является DP, также нет уведомления об изменении, которое инициирует привязку DataTrigger. – Clemens

+0

@Clemens Я не заметил свой язык, исправил его сейчас. – AnjumSKhan

+0

После настройки с кодом @Gopichandar, теперь я решил использовать событие 'PasswordChanged'. Спасибо за ваше предложение – Zolbayar

0

Как предложил @AnjumSKhan, я сделал это с PasswordBox.PasswordChanged событием. В случае, если у кого-то есть подобные проблемы, вот код для добавления заполнителя для PasswordBox.

В XAML файле:

<Window.Resources> 
    <VisualBrush x:Key="PasswordPlaceHolderBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None"> 
     <VisualBrush.Visual> 
      <Label Content="Нууц үг" Foreground="DarkGray"/> 
     </VisualBrush.Visual> 
    </VisualBrush> 
</Window.Resources> 

<PasswordBox PasswordChanged="passwordText_PasswordChanged" 
    Background="{StaticResource PasswordPlaceHolderBrush}" x:Name="passwordText"/> 

В коде позади:

private void passwordText_PasswordChanged(object sender, RoutedEventArgs e) 
{ 
    PasswordBox senderOb = (PasswordBox)sender; 
    if(senderOb.Password == "") 
    { 
     passwordText.Background = (VisualBrush) FindResource("PasswordPlaceHolderBrush"); 
    } 
    else 
    { 
     passwordText.Background = Brushes.White; 
    } 

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