简体   繁体   中英

how to bind a textbox that has an applied style in wpf

I style my TextBox using a ResourceDictionary (and have registered it in App.xaml ):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type TextBox}"
           x:Key="TextBoxTheme">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Border CornerRadius="12"
                            Background="#2E3135"
                            Width="{TemplateBinding Width}"
                            Height="{TemplateBinding Height}">
                        <Grid>
                            <TextBox BorderThickness="0"
                                     Background="Transparent"
                                     VerticalContentAlignment="Center"
                                     Padding="20,0,20,0"
                                     Foreground="#B8BDC1" />
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

My App.xaml :

<Application x:Class="Paraject.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Paraject"
             StartupUri="/MVVM/Views/Windows/LoginWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/UiDesign/Theme/TextBoxTheme.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

When I apply the style to my TextBox , my binding doesn't work.

My TextBox :

<TextBox x:Name="UsernameTextbox"
            Grid.Row="2"
            Width="303"
            Height="38"
            Margin="0,0,0,30"
            FontSize="15"
            Text="{Binding Path=CurrentUserAccount.Username}"
            Style="{StaticResource TextBoxTheme}" />

(the MessageBox es on the images below are shown after the button click)

What it looks like when I APPLY the Style :

在此处输入图像描述


What it looks like when I REMOVE the Style :

在此处输入图像描述


Even if I add Text="{TemplateBinding Text}" to my ResourceDictionary , the binding will still not work (if the Style is applied to my TextBox )


I now fixed it by: Adding in my TextBox control's Text property that is in the ResourceDictionary :

<TextBox Text="{Binding Path=Text,
            RelativeSource={RelativeSource TemplatedParent}, 
            Mode=TwoWay,
            UpdateSourceTrigger=PropertyChanged}"
            BorderThickness="0"
            Background="Transparent"
            VerticalContentAlignment="Center"
            Padding="20,0,20,0"
            Foreground="#B8BDC1"
            CaretBrush="#B8BDC1" />

You can use style as separate file like this:
App.xaml:

<Application x:Class="SomeClassHere"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Theme/TextBoxes.xaml" />
                <ResourceDictionary Source="Theme/AnotherFile.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

Theme/TextBoxes.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   <Style TargetType="{x:Type TextBox}"
          x:Key="TextBoxTheme">
      ...
   </Style>
</ResourceDictionary>

Or use style inside

<Application x:Class="SomeClassHere"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <Style TargetType="{x:Type TextBox}"
                   x:Key="TextBoxTheme">
                ...
             </Style>
        </ResourceDictionary>
    </Application.Resources>
</Application>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM