我有一个用户控件,它有一个文本框,它的文本属性绑定到一个名为 SelectedValue 的依赖属性。当用户输入文本时,该值将针对另一个名为 ItemsSource 的 DP 进行验证,以查看它是否在其中。如果没有,我会抛出一个错误。一切正常 - 当出现错误时,UC 中的 TB 周围有默认的红色框。
但我希望用户能够在创建 UC 实例时在 XAML 中指定 ControlTemplate。所以我想我可以创建另一个 ControlTemplate 类型的 DP,它们可以绑定到。这似乎可行,但我如何在 XAML 中实际实现它?如果它执行以下操作:
Validation.ErrorTemplate="{Binding ValidationTemplate}"
它抛出一个错误,说“'ErrorTemplate' 属性不能是数据绑定的。”。以下是代码的相关部分:
<Canvas DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}">
....
<TextBox x:Name="ValueTextBox"
TextWrapping="NoWrap"
GotFocus="_ValueTextBox_GotFocus"
Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type Canvas}}, Path=ActualWidth}"
Height="{Binding RelativeSource={RelativeSource AncestorType={x:Type Canvas}}, Path=ActualHeight}"
----->Validation.ErrorTemplate="{Binding ValidationTemplate}"<-----
>
<TextBox.Resources>
<CollectionViewSource x:Key="UniqueNamesList" Source="{Binding ItemsSource}" />
</TextBox.Resources>
<TextBox.Text>
<Binding Path="SelectedValue" >
<Binding.ValidationRules>
<l:InListValidator ValidationStep="RawProposedValue"
IgnoreCase="True"
UniqueNames="{StaticResource UniqueNamesList}" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
....
</Canvas>
和 DP 本身:
public object ValidationTemplate
{
get { return (ControlTemplate)GetValue(ValidationTemplateProperty); }
set { SetValue(ValidationTemplateProperty, value); }
}
public static readonly DependencyProperty ValidationTemplateProperty =
DependencyProperty.Register("ValidationTemplate"
, typeof(ControlTemplate)
, typeof(AutoCompleteComboBox)
, new FrameworkPropertyMetadata(new ControlTemplate()));
感谢您的帮助。
厄尼
更新:
多谢你们。我实际上尝试了 Adi 和 Nit 的回应。两者都有效,但 Adi 更接近我正在寻找的内容,而不必定义用户控件的本地模板。即使我没有实际创建模板而只是添加绑定但设计器给出了错误,Nit 也会实际运行。我确实不得不稍微调整一下你的代码,Adi 才能将它设置在 TextBox 本身上:
public ControlTemplate ValidationTemplate
{
get { return (ControlTemplate)GetValue(ValidationTemplateProperty); }
set { SetValue(ValidationTemplateProperty, value); }
}
public static readonly DependencyProperty ValidationTemplateProperty =
DependencyProperty.Register("ValidationTemplate"
, typeof(ControlTemplate)
, typeof(AutoCompleteComboBox)
, new FrameworkPropertyMetadata(new ControlTemplate(), OnValidationTemplateChanged));
private static void OnValidationTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null)
{
AutoCompleteComboBox control = (AutoCompleteComboBox)d;
Validation.SetErrorTemplate(control.ValueTextBox, (ControlTemplate)e.NewValue);
}
}
谢谢!