WPF Nested binding in a controltemplate

前端 未结 1 1996
無奈伤痛
無奈伤痛 2021-01-13 16:26

I have successfully created a textbox that displays / collapses an error message depending upon a validation rule set in its model / vm. The code goes like this for the emai

相关标签:
1条回答
  • 2021-01-13 17:15

    You won't need the Grid.Row and Grid.Column bindings in the Template StackPanel since the StackPanel won't be the direct child of a Grid anyway,

    TemplateBinding is always a OneWay binding so the Text property for the Templated TextBox will never get updated. Change it to a regular Binding with RelativeSource and TwoWay

    Change ElementName=validableText to RelativeSource={RelativeSource TemplatedParent} in the bindings for ContentPresenter since we want to perform the validation check on the Templated TextBox and not the TextBox inside the Template.

    <ControlTemplate x:Key="FormTextBox" TargetType="{x:Type TextBox}">
        <StackPanel>
            <TextBox x:Name="validableText"
                     MaxLength="{TemplateBinding MaxLength}"
                     Style="{StaticResource SectionEditPropertyTextBox}"
                     Text="{Binding RelativeSource={RelativeSource TemplatedParent},
                                    Path=Text,
                                    Mode=TwoWay,
                                    UpdateSourceTrigger=PropertyChanged}" />
            <ContentPresenter Visibility="{Binding RelativeSource={RelativeSource TemplatedParent},
                                                   Path=(Validation.HasError),
                                                   Converter={StaticResource BooleanToVisibilityConverter}
                                                   ConverterParameter=True}"
                                Content="{Binding RelativeSource={RelativeSource TemplatedParent},
                                                  Path=(Validation.Errors).CurrentItem}"
                                HorizontalAlignment="Left">
                <ContentPresenter.ContentTemplate>
                    <DataTemplate>
                        <Label Style="{StaticResource SectionEditErrorLabel}" Content="{Binding Path=ErrorContent}"/>
                    </DataTemplate>
                </ContentPresenter.ContentTemplate>
            </ContentPresenter>
        </StackPanel>
    </ControlTemplate>
    

    On a side note, another alternative that you have here is to create a UserControl with the original piece of Xaml that you had. You could introduce the Dependency Properties needed for your scenario (Text etc.). It would only require small changes.

    0 讨论(0)
提交回复
热议问题