給依賴屬性設置單向綁定時,直接給依賴屬性賦值,導致單向綁定永久失效

問題描述

在下面這段程式碼中,我們給控制項的某個屬性設置了單向綁定,然後在程式碼的某處給這個屬性顯式地賦了值,結果會導致我們在這之前設置的綁定永久失效。

//外部給Text屬性設置綁定
<TextBox Text="{Binding Name, Mode=OneWay}" />

//控制項內部程式碼
private void ClearButton_Click(object sender, RoutedEventArgs e)
{
    base.Text = string.Empty;
}

解決方案1

最簡單的解決方式是將綁定改為雙向的,那麼給任何一方顯式地賦值都不會使綁定失效

<TextBox Text="{Binding Name, Mode=TwoWay}" />

解決方案2

如果不想更改綁定方式,那麼可以在賦值前保存之前的綁定,在賦值後設置回去。這種方式驗證過,也是可行的,不過感覺程式碼不太優雅,當出現這種情況時,或許可以思考從設計層面去規避掉。

private void ClearButton_Click(object sender, RoutedEventArgs e)
{
    var bindingExpression = this.GetBindingExpression(TextProperty);
    Binding binding = bindingExpression?.ParentBinding;
    base.Text = string.Empty;
    if (binding != null)
    {
        this.SetBinding(TextBox.TextProperty, binding);
    }
}