Binding(二):控制元件關聯和程式碼提升

Charles_Su發表於2021-06-22

上節我們講到,使用Binding,我們可以關聯後臺程式碼中的屬性,在某些情況下,我們可能需要將兩個控制元件關聯起來,藉助Binding,我們也可以輕鬆的實現。

關聯控制元件

設想這樣一個場景,介面中有個CheckBox,和一個Button,只有當CheckBox被選中的時候,Button才可用或者顯示,如果按照常規的做法,那應該是藉助CheckBox的Click事件去手動控制Button的顯示等等,但我們如果使用Binding,則會簡單很多,請看如下程式碼:

Binding(二):控制元件關聯和程式碼提升

Binding有個ElementName的屬性,是專門用於跟控制元件做繫結的,把某個控制元件的名字賦給它,系統會自動去這個控制元件上找Path指定的屬性,CheckBox的IsChecked屬性用來指示是否被選中, 將其繫結到Button的IsEnabled屬性上,就可以實現兩者的聯動。

第二個Button則是使用Source的形式,藉助x名稱空間的Reference指令,拿到名稱為CB的控制元件引用,將其作為源,效果是一樣的。

其對應的後臺程式碼為(部分):

Binding binding = new Binding();
binding.Source = CB; //控制元件引用
binding.ElementName = "CB"; //控制元件名

 

執行效果如下:

Binding(二):控制元件關聯和程式碼提升

Binding(二):控制元件關聯和程式碼提升

當然,這是在兩個控制元件繫結的屬性型別都一致的情況下,如果不一致呢?比如說上述情景中讓Button顯示和隱藏,顯然bool是不能轉換為Visibility列舉的,這就需要用到資料轉換器了,我們下節再講,它主要還涉及到XAML資源的知識,適合單獨拿一節出來。

 

程式碼提升

在不使用第三方框架的情況下,我一般會使用如下程式碼來實現INotifyPropertyChanged介面:

public class NorifyBase:INotifyPropertyChanged
{
       public event PropertyChangedEventHandler PropertyChanged;
​
        protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
            OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
        }
        protected virtual void OnPropertyChanged(PropertyChangedEventArgs args)
        {
            this.PropertyChanged?.Invoke(this, args);
        }
}

 

將其再封裝一層,並且放在一個類裡邊作為父類,由子類去繼承,實現程式碼複用。、

這樣原來set塊中的通知邏輯就改為了如下所示:

//舊程式碼
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Data"));
//新程式碼
this.RaisePropertyChanged();

 

此處要解釋一下,CallerMemberName這個Attribute,它用來在執行時動態獲取呼叫者的名字,簡單來說就是在方法內呼叫它,它就獲取到方法的名賦給引數,在屬性塊中呼叫它,它就獲取到屬性名賦給引數,在類中就是類名。

 

 

相關文章