Textbox style is not triggered by INotifyDataErrorInfo when having template style for window defined

127 Views Asked by At

If I remove style attribute from my window then red border appears around my textboxes. But if I have style defined on window then it is not show? Why?

I figured out that "problem" is because Template property is defined in styles for window. When I remove that section then validation styling is shown like on other parts of application.

Here is my style for my window:

 <Style TargetType="{x:Type Window}" x:Key="LoginWindowStyle"  >

        <Setter Property="Width" Value="500"/>
        <Setter Property="Height" Value="700"/>
        <Setter Property="ResizeMode" Value="CanResize"/>
        <Setter Property="WindowStyle" Value="None"/>
        <Setter Property="AllowsTransparency" Value="True"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Window}">

                    <Border Background="White" CornerRadius="10">
                        <Border.Effect>
                            <DropShadowEffect ShadowDepth="5" Opacity="0.5"></DropShadowEffect>
                        </Border.Effect>
                        <Grid  Background="{TemplateBinding Background}">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="40"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <StackPanel Height="40" >
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition></ColumnDefinition>

                                        <ColumnDefinition Width="auto" ></ColumnDefinition>

                                    </Grid.ColumnDefinitions>

                                <TextBlock Grid.Column="0" Text="Login" FontSize="15" Margin="30 8 0 0" />
                                    <StackPanel Grid.Column="1" Orientation="Horizontal"  WindowChrome.IsHitTestVisibleInChrome="True">
                                        <Button Style="{DynamicResource WindowTopButtons}" Command="{Binding Minimize}"  Width="40" Height="40">
                                            <TextBlock>-</TextBlock>
                                        </Button>
                                        <Button Style="{DynamicResource WindowTopButtons}" Command="{Binding Maximize}" Margin="1 0 1 0"  Width="40" Height="40">
                                            <TextBlock>[]</TextBlock>
                                        </Button>
                                        <Button Style="{DynamicResource CloseButton}" Command="{Binding Close}"  Width="40" Height="40"  >
                                            <TextBlock>X</TextBlock>
                                        </Button>
                                    </StackPanel>
                                </Grid>

                            </StackPanel>

                            <ContentPresenter  Grid.Row="1"/>


                        </Grid>
                    </Border>


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

    </Style>

This is my login window:

 <Window x:Class="xxx.LoginWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:xxx.ViewModels"
  d:DataContext="{d:DesignInstance local:LoginViewModel,IsDesignTimeCreatable=True}"
    x:Name="LoginWindowName"
    mc:Ignorable="d"     
   WindowState="{Binding CurrentWindowState}"
    Style="{StaticResource LoginWindowStyle}"
    MinWidth="220"
    MinHeight="200"
    WindowStartupLocation="CenterScreen"
    Title="LoginWindow" >
<Window.Resources>
    <BooleanToVisibilityConverter x:Key="bvc" />
</Window.Resources>
<WindowChrome.WindowChrome >
    <WindowChrome ResizeBorderThickness="3" CaptionHeight="40">

    </WindowChrome>
</WindowChrome.WindowChrome>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="1*"/>
        <RowDefinition Height="2*"/>
    </Grid.RowDefinitions>
    <StackPanel  Grid.Row="0" Background="{StaticResource LoginGradient}" Margin="0,-5,0,0" >


        <TextBlock Text="Login"
                   VerticalAlignment="Bottom"
                   HorizontalAlignment="Center"
                   Foreground="White" FontSize="50"
                  ></TextBlock>

    </StackPanel>
    <StackPanel Grid.Row="1" >
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*"></ColumnDefinition>
                <ColumnDefinition Width="2*"></ColumnDefinition>
                <ColumnDefinition Width="1*"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <StackPanel Grid.Column="1">
                <StackPanel.Resources>
                    <Style  TargetType="{x:Type TextBox}"  BasedOn="{StaticResource ValidatedTextbox}">
                        <Setter Property="Background" Value="Red"></Setter>
                    </Style>
                </StackPanel.Resources>
                <TextBox  Text="{Binding UserName,Mode=TwoWay,
                    UpdateSourceTrigger=PropertyChanged,
                    ValidatesOnDataErrors=True,NotifyOnSourceUpdated=True}"
                         Background="LightGray" Height="30" Margin="0 0 0 10"/>

                <TextBox  Style="{StaticResource ValidatedTextbox}"  Text="{Binding Password,Mode=TwoWay,
                    UpdateSourceTrigger=PropertyChanged,
                    NotifyOnValidationError=True}"
                         Background="LightGray" Height="30"  Margin="0 0 0 10"/>
                <Button Command="{Binding LoginCommand}" CommandParameter="{Binding ElementName=LoginWindowName}" Background="LightGray" Height="30">Prijavi se</Button>
                <TextBlock Foreground="Red" Visibility="{Binding IncorrectLogin,Converter={StaticResource bvc}}">Your username and password combination is incorrect</TextBlock>
            </StackPanel>
        </Grid>
    </StackPanel>
</Grid>

1

There are 1 best solutions below

0
Keithernet On BEST ANSWER

In your Window style you need to wrap your ContentPresenter with an AdornerDecorator. The validation styles are implemented as Adorners, so if there isn't an AdornerDecorator, they will not be displayed.

<AdornerDecorator>
    <ContentPresenter />
</AdornerDecorator>