为动态创建的Binding对象创建属性路径的正确方法是什么?

时间:2015-01-16 14:59:11

标签: c# wpf xaml data-binding

我已经在静态类型(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);
    }
}

这就是我被困的地方。我应该如何用正确的路径方案创建这个Binding对象?

现在,上面的代码会抛出TypeNameParserException。我想我知道它为什么会这样,但即使它没有,如果由于某种原因我在包含Window / UserControl的命名空间中定义了不同的前缀怎么办?

1 个答案:

答案 0 :(得分:1)

你可以试试这个:

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/