【问题标题】:Clear Binding in FrameworkElement in code behind在后面的代码中清除 FrameworkElement 中的绑定
【发布时间】:2016-03-18 04:33:14
【问题描述】:

背景

我正在创建一个继承自 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。

问题

在后面的代码中,当我尝试创建这个新的绑定时,我在 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 是否会在TextProperty 上创建三个Bindings,或者因为它们都是对Binding 的相同引用,所以我不必调用SetBinding 三次?此外,如果 BindingPath 属性已更改(所以 Binding 现在指向其他地方,我是否需要在再次重置之前“取消注册”先前的绑定?如果是这样怎么做。我找不到任何在文档中听起来很正确。

【问题讨论】:

    标签: c# wpf code-behind


    【解决方案1】:

    你要找的是这个:

    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

    【讨论】:

      【解决方案2】:

      BindingOperations.ClearBinding(yourTextBox, TextBlock.TextProperty);

      【讨论】:

        猜你喜欢
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-14
        相关资源
        最近更新 更多