TextBox.Text возвращает пустую строку - PullRequest
0 голосов
/ 21 июня 2020

Я пару дней изучал C# и столкнулся со странной проблемой. У меня есть TextBox в приложении WPF, которое обычно работает без каких-либо проблем, но после того, как я применил к нему настраиваемый шаблон в XAML, он перестает возвращать текстовое значение. Это всегда пустая строка.

Мой шаблон в XAML:

<ControlTemplate x:Key="TextBoxBaseControlTemplate" TargetType="{x:Type TextBoxBase}">
        <Border x:Name="Bd" BorderBrush="DarkGray" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4,4,4,4">
            <TextBox Background="#353535" Foreground="White"/>
        </Border>
    </ControlTemplate>

Мой текстовый блок в XAML:

<TextBox x:Name="TextBox" Template="{StaticResource TextBoxBaseControlTemplate}" Foreground="White" BorderThickness="1" BorderBrush="DarkGray" HorizontalAlignment="Stretch" Height="23" Margin="53,0,105,15" TextWrapping="Wrap" Text="Enter city" VerticalAlignment="Bottom" GotFocus="TextBox_GotFocus" KeyDown="TextBox_KeyDown"/>

Как я могу это исправить?

1 Ответ

1 голос
/ 21 июня 2020

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

Очевидным решением было бы просто использовать расширение разметки для привязки текста например:

<TextBox Text="{TemplateBinding Text}" .../>

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

<ControlTemplate x:Key="TextBoxBaseControlTemplate" TargetType="{x:Type TextBox}">
    <Border x:Name="Bd" BorderBrush="DarkGray" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4,4,4,4">
        <TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, UpdateSourceTrigger=PropertyChanged}"
                 Background="#353535" Foreground="White"/>
    </Border>
</ControlTemplate>

Также обратите внимание, что TextBoxBase не указывает свойство Text, поэтому здесь следует отдавать предпочтение шаблону TextBox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...