Установите свойство в триггерах управления, используя Binding WPF - PullRequest
0 голосов
/ 05 сентября 2018

Я разработал TextBox в WPF, который может быть проверен автоматически и отображать сообщение об ошибке при неудачной проверке.

вот мой ControlTemplate:

 <Setter Property="Template">
     <Setter.Value>
     <ControlTemplate TargetType="Controls:ShamsText">
         <Grid>
             <Border Name="container" HorizontalAlignment="Left" Padding="{TemplateBinding Padding}" Height="{TemplateBinding Height}" BorderThickness="1" BorderBrush="#ccc" Background="{TemplateBinding Background}">
                 <ScrollViewer Padding="0" x:Name="PART_ContentHost" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" TextBlock.TextAlignment="Center" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
             </Border>

             <Popup Name="Popup" 
                     Placement="Top"
                     Focusable="False"
                     AllowsTransparency="True"
                     IsOpen="{TemplateBinding ComboBox.IsDropDownOpen}"
                     PopupAnimation="Slide">
                 <Grid>
                     <Border Padding="0 0 0 10">
                         <Border Name="DropDownBorder" 
                             Background="#35403F"
                             Padding="12 10 12 10"
                             Margin="0, 1, 0, 0"
                             SnapsToDevicePixels="True"
                             CornerRadius="4"                                         
                             BorderThickness="1,1,1,1" 
                             BorderBrush="#35403F">
                             <ScrollViewer SnapsToDevicePixels="True">
                                 <TextBlock Name="PopupText" FontWeight="Thin" TextWrapping="Wrap" MaxWidth="{TemplateBinding Width}" Text=" " Foreground="#E8E8E8"/>
                             </ScrollViewer>
                         </Border>
                     </Border>
                     <TextBlock Foreground="#35403F" VerticalAlignment="Bottom" Margin="15 0 0 0" Text="▼"></TextBlock>
                 </Grid>
             </Popup>
         </Grid>
             <ControlTemplate.Triggers>

вот мой триггер на его ControlTemplate:

 <MultiTrigger>
     <MultiTrigger.Conditions>
         <Condition Property="IsShowRequired" Value="True"></Condition>
         <Condition Property="IsFocused" Value="True"></Condition>
         <Condition Property="IsReadOnly" Value="False"></Condition>
         <Condition Property="Text" Value=""></Condition>
     </MultiTrigger.Conditions>
     <Setter TargetName="container" Property="BorderBrush" Value="#66AFE9"/>
     <Setter TargetName="PopupText" Property="Text" Value="Required Error Messagge"/>
     <Setter TargetName="Popup" Property="IsOpen" Value="True"></Setter>
 </MultiTrigger>

Я хочу сделать "Required Error Message" настраиваемым, поэтому я добавил свойство в свой класс TextBox:

 public static readonly DependencyProperty RequiredMessageProperty = DependencyProperty.Register("RequiredMessage", typeof(string), typeof(ShamsText), new PropertyMetadata("این مقدار اجباری است."));
 public string RequiredMessage
 {
     get { return (string)GetValue(RequiredMessageProperty); }
     set { SetValue(RequiredMessageProperty, value); }
 }

поэтому я изменил свой мульти-триггер на:

 <MultiTrigger>
     <MultiTrigger.Conditions>
         <Condition Property="IsShowRequired" Value="True"></Condition>
         <Condition Property="IsFocused" Value="True"></Condition>
         <Condition Property="IsReadOnly" Value="False"></Condition>
         <Condition Property="Text" Value=""></Condition>
     </MultiTrigger.Conditions>
     <Setter TargetName="container" Property="BorderBrush" Value="#66AFE9"/>
     <Setter TargetName="PopupText" Property="Text" Value="{Binding RequiredMessage}"/>
     <Setter TargetName="Popup" Property="IsOpen" Value="True"></Setter>
 </MultiTrigger>

но он устанавливает текст PopupText на ноль всякий раз, когда срабатывает этот триггер.

как я могу установить это значение динамически?

1 Ответ

0 голосов
/ 05 сентября 2018

Проблема с вашим Binding, использование вашего кода дало мне ошибки привязки. Измените свою привязку на:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsShowRequired" Value="True"></Condition>
        <Condition Property="IsFocused" Value="True"></Condition>
        <Condition Property="IsReadOnly" Value="False"></Condition>
        <Condition Property="Text" Value=""></Condition>
    </MultiTrigger.Conditions>
    <Setter TargetName="container" Property="BorderBrush" Value="#66AFE9"/>
    <Setter TargetName="PopupText" Property="Text" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=RequiredMessage}"/>
    <Setter TargetName="Popup" Property="IsOpen" Value="True"></Setter>
</MultiTrigger>
...