我正在处理一个从TextBox
派生的UserControl
。
我有自定义DependencyProperty HelperText
这样:
public static readonly DependencyProperty HelperTextProperty = DependencyProperty.Register("HelperText", typeof(ICTextBoxHelperText), typeof(ICTextBox));
public ICTextBoxHelperText HelperText
{
get { return (ICTextBoxHelperText)GetValue(HelperTextProperty); }
set { SetValue(HelperTextProperty, value); }
}
字符串
这是类类型ICTextBoxHelperText
,并有几个属性,我需要在用户界面。
public class ICTextBoxHelperText : DependencyObject
{
public static readonly DependencyProperty DefaultProperty = DependencyProperty.Register("Default", typeof(string), typeof(ICTextBoxHelperText));
public static string GetDefault(DependencyObject d) => (string)d.GetValue(DefaultProperty);
public static void SetDefault(DependencyObject d, string value) { d.SetValue(DefaultProperty, value); }
public static readonly DependencyProperty InvalidProperty = DependencyProperty.Register("Invalid", typeof(string), typeof(ICTextBoxHelperText));
public static string GetInvalid(DependencyObject d) => (string)d.GetValue(InvalidProperty);
public static void SetInvalid(DependencyObject d, string value) { d.SetValue(InvalidProperty, value); }
public static readonly DependencyProperty ValidatedProperty = DependencyProperty.Register("Validated", typeof(string), typeof(ICTextBoxHelperText));
public static string GetValidated(DependencyObject d) => (string)d.GetValue(ValidatedProperty);
public static void SetValidated(DependencyObject d, string value) { d.SetValue(ValidatedProperty, value); }
public static readonly DependencyProperty AutoValidatedProperty = DependencyProperty.Register("AutoValidated", typeof(string), typeof(ICTextBoxHelperText));
public static string GetAutoValidated(DependencyObject d) => (string)d.GetValue(AutoValidatedProperty);
public static void SetAutoValidated(DependencyObject d, string value) { d.SetValue(AutoValidatedProperty, value); }
}
型
下面是UI实现:
<!-- TextBox -->
<tx:ICTextBox x:Name="icTextBox"
Width="240"
Margin="0,20,0,0"
Padding="0"
VerticalAlignment="Center">
<!-- Helper Text -->
<tx:ICTextBox.HelperText>
<tx:ICTextBoxHelperText Default="{Binding ElementName=icTextBox, Path=Text, UpdateSourceTrigger=PropertyChanged}"
Invalid="Invalid"
Validated="Validated"
AutoValidated="AutoValidated"/>
</tx:ICTextBox.HelperText>
</tx:ICTextBox>
型ICTextBoxHelperText
的静态值按预期工作并更新UI。
问题出在绑定上。它根本不工作,我有这个XAML绑定异常Cannot find governing FrameworkElement or FrameworkContentElement for target element
。
据我所知,这一定是这个ICTextBoxHelperText
没有DataContext
的问题,但HelperText
是在FrameworkElement
内部声明的,这是我从TextBox
派生的控件。
这甚至有可能有一个DependencyProperty
是DependencyObject
类型吗?我这样做了,所以我会有一些类似类型的DependencyProperties
很好的分组,而不是一个houndred松散的DependencyProperties
在UserControl
。
1条答案
按热度按时间k7fdbhmy1#
在我看来不寻常的是你如何实现你的自定义依赖对象类
ICTextBoxHelperText
。你使用Register将它们注册为普通的依赖属性,但是Getters和Setters的语法是附加语法(使用GetNNN/SetNNN方法对而不是普通属性)。然而在XAML中,你似乎可以像访问“普通”非附加属性一样访问它们。此外,没有理由让它们附加属性。我建议重写ICTextBoxHelperText类并从
Freezable
派生,这是一个轻量级实现,保证链接到可视化树的DataContext中-而DependencyObject继承则没有。由于您的类只包含额外的数据,但没有控件模板/自己的可视化表示,因此从Control或UserControl派生它没有意义。所以我建议重写ICTextBoxHelperText,看看它是否解决了缺少DataContext的问题。
字符串