我有一个CustomControl
被ControlTemplate
. TheCustomControl
包含另一个CustomControl
with Label
, TextBox
and Validation.ErrorTemplate
for the TextBox
。
我想要做的是,当我将鼠标悬停CustomControl
或聚焦时TextBox
,Validation.ErrorTemplate
应该弹出窗口。
现在它只会弹出Validation.ErrorTemplate
当且仅当我Border
将TextBox
. 老实说,我不确定它是Border
fromStackPanel
还是AdornedElementPlaceholder
. 我真的不知道如何将DataTrigger
内部绑定Validation.ErrorTemplate
到外部Border
IsMouseOver
属性或IsFocused
从TextBox
.
在我到目前为止的代码下面:
<ControlTemplate TargetType="{x:Type my:CustomControl}" x:Key="CustomTemplate">
<Border BorderBrush="Green" BorderThickness="1" x:Name="outerBorder">
<my:LabelControl Label="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ViewModel.Label}">
<TextBox HorizontalAlignment="Stretch" Padding="3 0 3 0" Foreground="{DynamicResource Control.Foreground}">
<TextBox.Resources>
<Style TargetType="{x:Type Border}">
<Setter Property="CornerRadius" Value="3"/>
</Style>
</TextBox.Resources>
<TextBox.Text>
<Binding Path="ViewModel.Value" UpdateSourceTrigger="PropertyChanged" RelativeSource="{RelativeSource TemplatedParent}" ValidatesOnDataErrors="True"/>
</TextBox.Text>
<TextBox.Style>
<Triggers>
...
</Triggers>
</TextBox.Style>
<Validation.ErrorTemplate>
<ControlTemplate>
<StackPanel x:Name="BorderBorder">
<Border BorderThickness="1" BorderBrush="Red" CornerRadius="3" HorizontalAlignment="Left" >
<AdornedElementPlaceholder x:Name="textBox"/>
</Border>
<Border Background="LightGoldenrodYellow" CornerRadius="3">
<TextBlock Text="{Binding [0].ErrorContent}"/>
<Border.Style>
<Style>
<Setter Property="Border.Visibility" Value="Collapsed"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=BorderBorder, Path=IsMouseOver}" Value="true">
<Setter Property="Border.Visibility" Value="Visible"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
</StackPanel>
</ControlTemplate>
</Validation.ErrorTemplate>
</TextBox>
</my:LabelControl>
</Border>
</ControlTemplate>
所以如果可能的话,DataTrigger
内部Validation.ErrorTemplate
应该是绑定的ElementName=outerBorder
。
我想问题是我有一个ControlTemplate
内部 aControlTemplate
所以DataTrigger
Binding
内部ControlTemplate
( Validation.ErrorTemplate
) 不知道Properties
外部的。
您可以将 的Tag
属性绑定TextBox
到IsMouseOver
控件本身的属性,然后将 绑定DataTrigger
到Tag
装饰元素的属性:
<ControlTemplate TargetType="{x:Type my:CustomControl}" x:Key="CustomTemplate">
<Border BorderBrush="Green" BorderThickness="1" x:Name="outerBorder">
<my:LabelControl Label="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ViewModel.Label}">
<TextBox HorizontalAlignment="Stretch" Padding="3 0 3 0" Foreground="{DynamicResource Control.Foreground}"
Tag="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=my:CustomControl}}">
<TextBox.Resources>
<Style TargetType="{x:Type Border}">
<Setter Property="CornerRadius" Value="3"/>
</Style>
</TextBox.Resources>
<TextBox.Text>
<Binding Path="ViewModel.Value" UpdateSourceTrigger="PropertyChanged" RelativeSource="{RelativeSource TemplatedParent}" ValidatesOnDataErrors="True"/>
</TextBox.Text>
<Validation.ErrorTemplate>
<ControlTemplate>
<StackPanel x:Name="BorderBorder">
<Border BorderThickness="1" BorderBrush="Red" CornerRadius="3" HorizontalAlignment="Left" >
<AdornedElementPlaceholder x:Name="textBox"/>
</Border>
<Border Background="LightGoldenrodYellow" CornerRadius="3">
<TextBlock Text="{Binding [0].ErrorContent}"/>
<Border.Style>
<Style>
<Setter Property="Border.Visibility" Value="Collapsed"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding AdornedElement.(TextBox.Tag), ElementName=textBox}" Value="True">
<Setter Property="Border.Visibility" Value="Visible"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
</StackPanel>
</ControlTemplate>
</Validation.ErrorTemplate>
</TextBox>
</my:LabelControl>
</Border>
</ControlTemplate>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句