Данные запускаются при попытке получить свойство Text.IsEmpty или Text.IsNullOrEmpty - PullRequest
0 голосов
/ 17 марта 2020

Я создаю базовый стиль для своих текстовых вводов, у них будет заполнитель. Я пытаюсь связать свойство Text.IsEmpty, но оно не существует. Итак, я попробовал следующее

<Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Border BorderBrush="{TemplateBinding BorderBrush}" 
                            BorderThickness="{TemplateBinding BorderThickness}" 
                            Background="{TemplateBinding Background}"
                            CornerRadius="{TemplateBinding Border.CornerRadius}">

                        <Grid>
                            <TextBlock x:Name="Placeholder" Visibility="Visible" Text="{TemplateBinding Tag}"></TextBlock>
                            <ScrollViewer Background="Transparent" Margin="0" x:Name="PART_ContentHost"/>
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding ElementName=PART_ContentHost,Path=IsFocused}" Value="False" />
                                <Condition Binding="{Binding ElementName=PART_ContentHost, Path=Text.IsEmpty}" Value="True" />
                        </MultiDataTrigger.Conditions>
                            <Setter TargetName="Placeholder" Property="Visibility" Value="Collapsed"/>
                        </MultiDataTrigger>

                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>

Для простоты я напишу здесь мульти-триггер для всего, что я пробовал.

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
         <Condition Binding="{Binding  RelativeSource={x:Static RelativeSource.Self},Path=IsFocused}" Value="False" />
         <Condition Binding="{Binding RelativeSource={x:Static RelativeSource.Self},Path=Text.IsEmpty}" Value="True" />
         </MultiDataTrigger.Conditions>
         <Setter TargetName="Placeholder" Property="Visibility" Value="Collapsed"/>
</MultiDataTrigger>

Оба из которых делают не работает, я не очень глубоко в использовании RelativeSource, так что, возможно, я использую неправильное свойство источника? Может кто-нибудь предложить то, к чему я должен привязаться для моих условий.

Текст не должен быть, пробелы считаются без текста.

Или, если ввод сфокусирован, заполнитель исчезает.

1 Ответ

1 голос
/ 17 марта 2020

Первая проблема, которую я вижу, заключается в том, что ваша логика c перевернута. Ваш триггер говорит, что если элемент управления не сфокусирован, а текст пуст, скрыть заполнитель. (Я не думаю, что это то, что вы хотите)

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

В моем примере ниже я сделал заполнитель Collapsed по умолчанию. Если один из триггеров сработает, он установит его на Visible. Я добавил дополнительный триггер для обработки null.

. Я также использую IsKeyboardFocusWithin, что более надежно.

Вот рабочий пример:

<TextBox
    Width="200"
    Height="24"
    Tag="Enter something...">
    <TextBox.Style>
        <Style BasedOn="{StaticResource {x:Type TextBox}}" TargetType="{x:Type TextBox}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Border
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            CornerRadius="{TemplateBinding Border.CornerRadius}">
                            <Grid>
                                <TextBlock x:Name="Placeholder"
                                    Text="{TemplateBinding Tag}"
                                    Visibility="Collapsed" />
                                <ScrollViewer x:Name="PART_ContentHost"
                                    Margin="0"
                                    Background="Transparent" />
                            </Grid>
                        </Border>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsKeyboardFocusWithin" Value="False" />
                                    <Condition Property="Text" Value="{x:Static sys:String.Empty}" />
                                </MultiTrigger.Conditions>
                                <Setter TargetName="Placeholder" Property="Visibility" Value="Visible" />
                            </MultiTrigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsKeyboardFocusWithin" Value="False" />
                                    <Condition Property="Text" Value="{x:Null}" />
                                </MultiTrigger.Conditions>
                                <Setter TargetName="Placeholder" Property="Visibility" Value="Visible" />
                            </MultiTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </TextBox.Style>
</TextBox>

Надеюсь, это поможет.

...