WPF Verschachtelte Bindung in einer controltemplate
Habe ich erfolgreich erstellt ein Textfeld, das angezeigt /kollabiert eine Fehlermeldung in Abhängigkeit von einer Gültigkeitsregel in seinem Modell /vm. Der code geht wie folgt für die E-Mail-BSP.:
<StackPanel Grid.Row="3" Grid.Column="1">
<TextBox MaxLength="200" x:Name="mailTextBox"
Style="{StaticResource SectionEditPropertyTextBox}"
Text="{Binding Email, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
<ContentPresenter Visibility="{Binding ElementName=mailTextBox, Path=(Validation.HasError), Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=True }"
Content="{Binding ElementName=mailTextBox, Path=(Validation.Errors).CurrentItem}"
HorizontalAlignment="Left">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<Label Style="{StaticResource SectionEditErrorLabel}" Content="{Binding Path=ErrorContent}"/>
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
</StackPanel>
Da habe ich ein paar von diesen würde ich gerne dies alles in einem Steuerelement Vorlage und platzieren Sie diese in einem gemeinsamen Ressource-Datei.
Mein template sieht wie folgt aus:
<ControlTemplate x:Key="FormTextBox" TargetType="{x:Type TextBox}">
<StackPanel Grid.Row="{TemplateBinding Grid.Row}" Grid.Column="{TemplateBinding Grid.Column}">
<TextBox x:Name="validableText" MaxLength="{TemplateBinding MaxLength}"
Style="{StaticResource SectionEditPropertyTextBox}"
Text="{TemplateBinding Text}" />
<ContentPresenter Visibility="{Binding ElementName=validableText, Path=(Validation.HasError), Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=True }"
Content="{Binding ElementName=validableText, Path=(Validation.Errors).CurrentItem}"
HorizontalAlignment="Left">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<Label Style="{StaticResource SectionEditErrorLabel}" Content="{Binding Path=ErrorContent}"/>
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
</StackPanel>
</ControlTemplate>
und ich link wie dieser:
<TextBox Grid.Row="3" Grid.Column="1" MaxLength="200" Template="{StaticResource FormTextBox}"
Text="{Binding Email, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
Leider führt keine Validierung, also die Bindung muss gebrochen werden, irgendwie...
Bitte raten...
Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werden Sie nicht brauchen, die
Grid.Row
undGrid.Column
Bindungen in der Vorlage StackPanel da dieStackPanel
werden nicht die direkten Kinder einesGrid
sowieso,TemplateBinding
ist immer eineOneWay
Bindung derText
Eigenschaft für die VorlagenTextBox
wird nie aktualisiert. Ändern Sie es zu einem regelmäßigen Bindung mitRelativeSource
undTwoWay
Ändern
ElementName=validableText
zuRelativeSource={RelativeSource TemplatedParent}
in die Bindungen fürContentPresenter
da wir möchten, führen Sie die Gültigkeitsprüfung auf die VorlagenTextBox
und nicht dieTextBox
in der Vorlage.Auf einer seitlichen Anmerkung, eine weitere alternative, die Sie hier haben, ist das erstellen einer
UserControl
mit dem original-Stück der Xaml-Code, der Sie hatte. Man könnte einführen, die Abhängigkeit Eigenschaften, die für Ihr Szenario (Text, etc.). Es würde erfordern nur kleine änderungen.