ErrorTemplate 的不同 ControlTemplates
Different ControlTemplates for ErrorTemplate
在我的应用程序中,我有一个 ControlTemplate
,我用它来显示 TextBox
的输入无效。 ControlTemplate
定义为:
<ControlTemplate x:Key="TextBoxErrorTemplate" TargetType="Control">
<Grid ClipToBounds="False">
<Border BorderBrush="Red" BorderThickness="1" Margin="-1">
<AdornedElementPlaceholder Name="adornedElement" />
</Border>
<Image HorizontalAlignment="Right" VerticalAlignment="Top"
Width="16" Height="16" Margin="0,-9,-8,0" Source="pack://application:,,,/UI.Resources;component/Graphics/Error_16_16.png"
ToolTip="{Binding ElementName=adornedElement, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
</Grid>
</ControlTemplate>
用法是:
<TextBox Grid.Row="1" Margin="0,5"
Text="{Binding UserGroup.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
Validation.ErrorTemplate="{StaticResource TextBoxErrorTemplate}"/>
用户组-class 实现了IDataErrorInfo
-接口。 class 的一小部分看起来像:
public class UserGroup
{
public string Name
{
get { return Get(() => Name); }
set { Set(() => Name, value); }
}
public bool IsDuplicate
{
get { return Get(() => IsDuplicate); }
set { Set(() => IsDuplicate, value); }
}
public bool IsSimilar
{
get { return Get(() => IsSimilar); }
set { Set(() => IsSimilar, value);}
}
}
而 IDataErrorInfo
所需的 getter 的实现如下所示:
public string this[string columnName]
{
get
{
string result = string.Empty;
string namePropertyName = GetPropertyNameFromExpression(() => Name);
string isDuplicatePropertyName = GetPropertyNameFromExpression(() => IsDuplicate);
string isSimilarPropertyName = GetPropertyNameFromExpression(() => IsSimilar);
if (columnName == namePropertyName)
{
if(IsSimilar)
{
result = "Be careful with similar group-names!";
if (!Error.Contains(isSimilarPropertyName))
{
Error += isSimilarPropertyName;
}
}
else
{
Error = Error.Replace(isSimilarPropertyName, string.Empty);
}
if (IsDuplicate)
{
result = "Duplicate names are not allowed!";
if (!Error.Contains(isDuplicatePropertyName))
{
Error += isDuplicatePropertyName;
}
}
else
{
Error = Error.Replace(isDuplicatePropertyName, string.Empty);
}
}
return result;
}
}
因此,如果 IsSimilar
或 IsDuplicate
为真,则将使用 TextBoxErrorTemplate-ControlTemplate
。
我想要的是仅当 IsDuplicate
等于 true 时才应使用 TextBoxErrorTemplate。
如果 IsSimilar
等于 true 我想使用以下 ControlTemplate
:
<ControlTemplate x:Key="TextBoxWarningTemplate" TargetType="Control">
<Grid ClipToBounds="False">
<Border BorderBrush="Orange" BorderThickness="1" Margin="-1">
<AdornedElementPlaceholder Name="adornedElement" />
</Border>
<Image HorizontalAlignment="Right" VerticalAlignment="Top"
Width="16" Height="16" Margin="0,-9,-8,0" Source="pack://application:,,,/UI.Resources;component/Graphics/Warning_16_16.png"
ToolTip="{Binding ElementName=adornedElement, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
</Grid>
</ControlTemplate>
有办法实现吗?我的第一种方法是用 Border
覆盖 TextBox 并仅在 IsSimilar
为真时显示它,但这看起来不太好...
我读过 TemplateSelector
,但只是在 DataGridTemplateColumn
的上下文中
我自己解决的。解决方案只有一个 ControlTemplate
,其中 ImageSource
和 BorderBrush
绑定到一个 UserGroup-属性 并且决定在两个转换器中完成。
ControlTemplate
看起来像:
<ControlTemplate x:Key="TextBoxErrorTemplate" TargetType="Control">
<Grid ClipToBounds="False">
<Border BorderThickness="1" Margin="-1"
BorderBrush="{Binding DataContext.UserGroup, Converter={converters:UserGroupToBrushConverter},
RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}">
<AdornedElementPlaceholder Name="adornedElement" />
</Border>
<Image HorizontalAlignment="Right" VerticalAlignment="Top"
Width="16" Height="16" Margin="0,-9,-8,0"
Source="{Binding DataContext.UserGroup, Converter={converters:UserGroupToImageSourceConverter},
RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
ToolTip="{Binding ElementName=adornedElement, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
</Grid>
</ControlTemplate>
在我的应用程序中,我有一个 ControlTemplate
,我用它来显示 TextBox
的输入无效。 ControlTemplate
定义为:
<ControlTemplate x:Key="TextBoxErrorTemplate" TargetType="Control">
<Grid ClipToBounds="False">
<Border BorderBrush="Red" BorderThickness="1" Margin="-1">
<AdornedElementPlaceholder Name="adornedElement" />
</Border>
<Image HorizontalAlignment="Right" VerticalAlignment="Top"
Width="16" Height="16" Margin="0,-9,-8,0" Source="pack://application:,,,/UI.Resources;component/Graphics/Error_16_16.png"
ToolTip="{Binding ElementName=adornedElement, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
</Grid>
</ControlTemplate>
用法是:
<TextBox Grid.Row="1" Margin="0,5"
Text="{Binding UserGroup.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
Validation.ErrorTemplate="{StaticResource TextBoxErrorTemplate}"/>
用户组-class 实现了IDataErrorInfo
-接口。 class 的一小部分看起来像:
public class UserGroup
{
public string Name
{
get { return Get(() => Name); }
set { Set(() => Name, value); }
}
public bool IsDuplicate
{
get { return Get(() => IsDuplicate); }
set { Set(() => IsDuplicate, value); }
}
public bool IsSimilar
{
get { return Get(() => IsSimilar); }
set { Set(() => IsSimilar, value);}
}
}
而 IDataErrorInfo
所需的 getter 的实现如下所示:
public string this[string columnName]
{
get
{
string result = string.Empty;
string namePropertyName = GetPropertyNameFromExpression(() => Name);
string isDuplicatePropertyName = GetPropertyNameFromExpression(() => IsDuplicate);
string isSimilarPropertyName = GetPropertyNameFromExpression(() => IsSimilar);
if (columnName == namePropertyName)
{
if(IsSimilar)
{
result = "Be careful with similar group-names!";
if (!Error.Contains(isSimilarPropertyName))
{
Error += isSimilarPropertyName;
}
}
else
{
Error = Error.Replace(isSimilarPropertyName, string.Empty);
}
if (IsDuplicate)
{
result = "Duplicate names are not allowed!";
if (!Error.Contains(isDuplicatePropertyName))
{
Error += isDuplicatePropertyName;
}
}
else
{
Error = Error.Replace(isDuplicatePropertyName, string.Empty);
}
}
return result;
}
}
因此,如果 IsSimilar
或 IsDuplicate
为真,则将使用 TextBoxErrorTemplate-ControlTemplate
。
我想要的是仅当 IsDuplicate
等于 true 时才应使用 TextBoxErrorTemplate。
如果 IsSimilar
等于 true 我想使用以下 ControlTemplate
:
<ControlTemplate x:Key="TextBoxWarningTemplate" TargetType="Control">
<Grid ClipToBounds="False">
<Border BorderBrush="Orange" BorderThickness="1" Margin="-1">
<AdornedElementPlaceholder Name="adornedElement" />
</Border>
<Image HorizontalAlignment="Right" VerticalAlignment="Top"
Width="16" Height="16" Margin="0,-9,-8,0" Source="pack://application:,,,/UI.Resources;component/Graphics/Warning_16_16.png"
ToolTip="{Binding ElementName=adornedElement, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
</Grid>
</ControlTemplate>
有办法实现吗?我的第一种方法是用 Border
覆盖 TextBox 并仅在 IsSimilar
为真时显示它,但这看起来不太好...
我读过 TemplateSelector
,但只是在 DataGridTemplateColumn
我自己解决的。解决方案只有一个 ControlTemplate
,其中 ImageSource
和 BorderBrush
绑定到一个 UserGroup-属性 并且决定在两个转换器中完成。
ControlTemplate
看起来像:
<ControlTemplate x:Key="TextBoxErrorTemplate" TargetType="Control">
<Grid ClipToBounds="False">
<Border BorderThickness="1" Margin="-1"
BorderBrush="{Binding DataContext.UserGroup, Converter={converters:UserGroupToBrushConverter},
RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}">
<AdornedElementPlaceholder Name="adornedElement" />
</Border>
<Image HorizontalAlignment="Right" VerticalAlignment="Top"
Width="16" Height="16" Margin="0,-9,-8,0"
Source="{Binding DataContext.UserGroup, Converter={converters:UserGroupToImageSourceConverter},
RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
ToolTip="{Binding ElementName=adornedElement, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
</Grid>
</ControlTemplate>