У меня есть пользовательский элемент управления, у которого есть текстовое поле, где его свойство text привязано к свойству зависимостей, называемому SelectedValue. Когда пользователь вводит текст, это значение проверяется против другого DP, называемого ItemsSource, чтобы узнать, есть ли он там. Если нет, я выдаю ошибку. Все работает - TB в UC имеет по умолчанию красный квадрат вокруг него, когда есть ошибка.Binding Validation.ErrorTemplate в UserControl
Но я хотел бы, чтобы пользователь мог указать ControlTemplate в XAML при создании экземпляра UC. Поэтому я подумал, что могу создать еще один DP типа ControlTemplate, с которым они могли бы связываться. Кажется, это работает, но как я могу реализовать это в XAML? Если это что-то вроде: «Свойство„ErrorTemplate“не может быть с привязкой к данным»
Validation.ErrorTemplate="{Binding ValidationTemplate}"
он бросает ошибку говоря. Ниже приведены соответствующие части кода:
<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()));
Спасибо за любую помощь.
Эрни
Update:
Спасибо парни. Я действительно пробовал ответы Ади и Нита. Оба работали, но Ади был ближе к тому, что я искал, не имея необходимости определять шаблон, локальный для User Control. Nit фактически работает, даже если я на самом деле не создаю шаблон и просто добавляю привязку, но дизайнер дает ошибку. Мне пришлось немного настроить код Ади, чтобы установить его на самом текстовом поле:
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);
}
}
Спасибо!