【发布时间】:2017-05-10 18:49:50
【问题描述】:
我有一个名为 TxtBox 的类,带有一个附加属性:
public class TxtBox
{
public static readonly DependencyProperty TypeProperty = DependencyProperty.RegisterAttached(
"Type", typeof (Enums.FieldType), typeof (TextBox), new PropertyMetadata(default(Enums.FieldType),OnTypeChanged));
public static void SetType(DependencyObject element, Enums.FieldType value)
{
element.SetValue(TypeProperty, value);
}
public static Enums.FieldType GetType(DependencyObject element)
{
return (Enums.FieldType) element.GetValue(TypeProperty);
}
private static void OnTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var src = (TextBox) d; //(FrameworkElement)d;
var binding = BindingOperations.GetBinding(src, TextBox.TextProperty);
if (binding != null) //Binding here is always null ?????????
{
binding.Converter = new NumberConverter();
binding.ConverterParameter = e.NewValue;
}
}
}
在 MainWindow.xaml 中:
<Grid Margin="10">
<TextBox Text="{Binding RequestNo}" att:TxtBox.Type="Number" />
<\Grid>
一旦我通过附加属性(类型)设置了文本框控件的类型,我需要为TextProperty 分配Converter 和ConverterParameter。当OnTypeChanged 方法触发时,我无法获取绑定,因为它始终为空!!!
提前致谢:)
【问题讨论】:
-
依赖于设置属性的顺序不是一个好主意。现在您假设 Text 属性是在附加属性之前设置的,但情况似乎并非如此。首先设置附加属性,然后设置文本。
-
更好的方法是强制同时设置绑定和类型。一种可能的方法是在附加属性语法中包含绑定本身,或者使用指定绑定目标的简单文本值,或者允许提供整个
Binding对象。另一种可能更好的方法是编写一个标记扩展来代替{Binding}标记。尽管如此,我不相信你的设计是一个好的开始;仅在{Binding}语法本身中指定转换器和参数有什么问题?真的有那么麻烦吗? -
不,这并不繁琐,但我怎样才能让转换器只接受已知类型为枚举?,而且我不希望在 xaml 文件中看到拥挤的代码,以提高可读性和简单性。
-
另外我尝试设计一个简单的库来在我的整个项目中使用它。