为动态创建的 Binding 对象创建 属性 路径的正确方法?
Proper way of creating a property path for a dynamically created Binding object?
我已经在静态类型上创建了附加的依赖属性 (DataField
)。其中有Owner
属性和Name
属性。这些可以附加到任何 DependencyObject
个实例。
在某些控件上,例如 TextBox
我想要这些附加属性的额外行为,所以我覆盖了另一个静态类型的元数据:
static void OverrideDataFieldMetaData()
{
//...
DataField.NameProperty.OverrideMetadata(typeof(TextBox), new UIPropertyMetadata(new PropertyChangedCallback(OnFieldNameChanged)));
//...
}
在OnFieldNameChanged
方法中我想动态创建一个Binding
对象并将其设置在控件的Text
上 属性:
//...
private static void OnFieldNameChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
OnFieldNameChanged((TextBox)o, (string)e.OldValue, (string)e.NewValue);
}
private static void OnFieldNameChanged(TextBox tb, string oldValue, string newValue)
{
if (string.IsNullOrWhiteSpace(newValue))
BindingOperations.ClearBinding(tb, TextBox.TextProperty);
else
{
// PROBLEM HERE!
var binding = new Binding("(fc:DataField.Owner)." + newValue);
binding.Source = tb;
tb.SetBinding(TextBox.TextProperty, binding);
}
}
这就是我卡住的地方。我应该如何使用正确的路径方案创建此绑定对象?
现在上面的代码抛出 TypeNameParserException
。我想我明白为什么会这样,但即使没有,如果出于某种原因我在包含 Window
/ UserControl
?
的命名空间中定义了不同的前缀怎么办?
你可以试试这个:
Binding b = new Binding();
b.Path = new PropertyPath("(0)", DataField.OwnerProperty);
在后面的代码中,您不需要命名空间定义,因为您有 属性.
的 直接 引用
来源:https://srndolha.wordpress.com/2008/01/11/wpf-binding-to-a-custom-attached-property-in-code/
我已经在静态类型上创建了附加的依赖属性 (DataField
)。其中有Owner
属性和Name
属性。这些可以附加到任何 DependencyObject
个实例。
在某些控件上,例如 TextBox
我想要这些附加属性的额外行为,所以我覆盖了另一个静态类型的元数据:
static void OverrideDataFieldMetaData()
{
//...
DataField.NameProperty.OverrideMetadata(typeof(TextBox), new UIPropertyMetadata(new PropertyChangedCallback(OnFieldNameChanged)));
//...
}
在OnFieldNameChanged
方法中我想动态创建一个Binding
对象并将其设置在控件的Text
上 属性:
//...
private static void OnFieldNameChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
OnFieldNameChanged((TextBox)o, (string)e.OldValue, (string)e.NewValue);
}
private static void OnFieldNameChanged(TextBox tb, string oldValue, string newValue)
{
if (string.IsNullOrWhiteSpace(newValue))
BindingOperations.ClearBinding(tb, TextBox.TextProperty);
else
{
// PROBLEM HERE!
var binding = new Binding("(fc:DataField.Owner)." + newValue);
binding.Source = tb;
tb.SetBinding(TextBox.TextProperty, binding);
}
}
这就是我卡住的地方。我应该如何使用正确的路径方案创建此绑定对象?
现在上面的代码抛出 TypeNameParserException
。我想我明白为什么会这样,但即使没有,如果出于某种原因我在包含 Window
/ UserControl
?
你可以试试这个:
Binding b = new Binding();
b.Path = new PropertyPath("(0)", DataField.OwnerProperty);
在后面的代码中,您不需要命名空间定义,因为您有 属性.
的 直接 引用来源:https://srndolha.wordpress.com/2008/01/11/wpf-binding-to-a-custom-attached-property-in-code/