在后面的代码中清除FrameworkElement中的绑定

时间:2013-10-22 16:54:09

标签: c# wpf code-behind

背景

我正在创建一个新的控件,它继承自TextBox包裹Binding。基本上,您可以创建一个TextBox只有ValidationRule而没有XAML中所需的额外代码。所以而不是:

<TextBox>
    <TextBox.Text>
        <Binding Path="DisplayWidth"
                 Converter="{StaticResource DistanceUnitConverter}">
            <Binding.ValidationRules>
                <valid:DoubleValidationRule/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

它将简化为:

<ctrls:ValidateConvertTextBox BindingPath="DisplayWidth"
                              ValidationRule="{StaticResource DoubleValidationRule}"
                              ValueConverter="{StaticResource DistanceUnitConverter}"/>

之所以这样,是因为我有很多这样的地方,我不能创建一个使用类似的东西的模板:

 <Binding Path="{TemplateBinding Path}">
     ...
 </Binding>

因为Path不是DependencyProperty。

问题

在后面的代码中,当我尝试创建这个新的Binding时,我在XAML中显示了上面显示的3个依赖项属性,如下所示:

private void SetBindingPath( string value )
{
    if( string.IsNullOrWhiteSpace( value ) ) return;

    Binding = new Binding( value );
    SetBinding( TextProperty, Binding );
}

private void SetValidationRule( ValidationRule value )
{
    if( Binding != null )
    {
        Binding.ValidationRules.Clear();
        Binding.ValidationRules.Add( value );

        SetBinding( TextProperty, Binding );
    }
}

private void SetValueConverter( IValueConverter value )
{
    if( Binding != null )
    {
        Binding.Converter = value;
        SetBinding( TextProperty, Binding );
    }
}

我想知道调用SetBinding是否会在Bindings上创建三个TextProperty,或者因为它们都与Binding相同,所以我不必致电SetBinding {1}}三次?此外,如果BindingPath属性已更改(所以Binding现在指向其他位置,我是否需要“重新注册”之前的绑定才能再次重置?如果是这样,该怎么做。我无法'找到文档中听起来正确的任何内容。

2 个答案:

答案 0 :(得分:4)

你要找的是:

http://msdn.microsoft.com/en-us/library/ms748951.aspx

BindingOperations.ClearBinding(myText, TextBlock.TextProperty);

另请看一下:

http://msdn.microsoft.com/en-us/library/system.windows.data.bindingoperations.clearallbindings.aspx

答案 1 :(得分:0)

BindingOperations.ClearBinding(yourTextBox,TextBlock.TextProperty);