.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
相关产品推荐
相关产品推荐

