You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 6 WPF中TextBox.Text始终返回默认值的问题求助

问题原因与修复方案

你的问题出在自定义TextBox样式的ControlTemplate里:嵌套的内部TextBox使用了单向的TemplateBinding,导致用户输入无法同步回外部TextBox的Text属性,所以点击按钮时获取的始终是XAML里设置的默认值。

修复方法一:将绑定改为双向模式

把内部TextBox的Text绑定从{TemplateBinding Text}改成双向绑定,确保输入内容能同步到外部控件:

<Style x:Key="InputFieldStyle" TargetType="TextBox">
    <Setter Property="OverridesDefaultStyle" Value="True"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Border
                    CornerRadius="10"
                    Background="#464646"
                    Padding="5">
                    <!-- 替换TemplateBinding为双向绑定 -->
                    <TextBox
                        Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, Mode=TwoWay}"
                        FontSize="16"
                        Margin="1"
                        BorderThickness="0"
                        Background="Transparent"
                        Padding="5"
                        Foreground="White"
                        TextWrapping="WrapWithOverflow"
                        CaretBrush="White"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

修复方法二:遵循WPF控件模板规范(更推荐)

WPF的TextBox默认模板不会嵌套另一个TextBox,而是用ScrollViewer和ContentPresenter来承载输入内容。这种写法更规范,也能避免嵌套控件带来的绑定问题:

<Style x:Key="InputFieldStyle" TargetType="TextBox">
    <Setter Property="OverridesDefaultStyle" Value="True"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Border
                    CornerRadius="10"
                    Background="#464646"
                    Padding="5">
                    <ScrollViewer x:Name="PART_ContentHost"
                                  Margin="1"
                                  Background="Transparent"
                                  Foreground="White"
                                  FontSize="16"
                                  CaretBrush="White"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

注:PART_ContentHost是WPF TextBox模板约定的名称,控件内部会自动将输入内容关联到这个ScrollViewer,无需手动绑定Text属性。

修改后再点击按钮,就能正确获取用户输入的内容了。

内容的提问来源于stack exchange,提问作者Bohdan Petrenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:40:31