WPF快速指導4:資料繫結之繫結方向與自定義轉換器

weixin_33858249發表於2017-05-26

WPF快速指導4:資料繫結之繫結方向與自定義轉換器
    本文摘要:
    1:繫結目標與繫結源之間的方向;
    2:自定義轉換器; 

1:繫結目標與繫結源之間的方向
    該部分的定義MSDN已經描述的非常清楚了,如下:
    您可能希望應用程式使使用者可以更改資料並將資料傳播回源物件。或者,您可能不希望允許使用者更新源資料。您可以通過設定 Binding 物件的 Mode 屬性來對此進行控制。下圖演示不同型別的資料流: 

image


OneWay
 繫結導致對源屬性的更改會自動更新目標屬性,但是對目標屬性的更改不會傳播回源屬性。此繫結型別適用於繫結的控制元件為隱式只讀控制元件的情況。例如,您可能繫結到如股票行情自動收錄器這樣的源,或許目標屬性沒有用於進行更改的控制元件介面(如表的資料繫結背景色)。如果無需監視目標屬性的更改,則使用 OneWay 繫結模式可避免TwoWay 繫結模式的系統開銷。
TwoWay 繫結導致對源屬性的更改會自動更新目標屬性,而對目標屬性的更改也會自動更新源屬性。此繫結型別適用於可編輯窗體或其他完全互動式 UI 方案。大多數屬性都預設為 OneWay 繫結,但是一些依賴項屬性(通常為使用者可編輯的控制元件的屬性,如 TextBox 的 Text 屬性和 CheckBox 的 IsChecked 屬性)預設為 TwoWay 繫結。確定依賴項屬性繫結在預設情況下是單向還是雙向的程式設計方法是:使用 GetMetadata 獲取屬性的屬性後設資料,然後檢查 BindsTwoWayByDefault 屬性的布林值。
OneWayToSource 與 OneWay 繫結相反;它在目標屬性更改時更新源屬性。一個示例方案是您只需要從 UI 重新計算源值的情況。
OneTime 繫結未在圖中顯示,該繫結會導致源屬性初始化目標屬性,但不傳播後續更改。這意味著,如果資料上下文發生了更改,或者資料上下文中的物件發生了更改,則更改會反映在目標屬性中。如果您使用的資料的當前狀態的快照適於使用,或者這些資料是真正靜態的,則適合使用此繫結型別。如果要使用源屬性中的某個值初始化目標屬性,並且事先不知道資料上下文,則也可以使用此繫結型別。此繫結型別實質上是 OneWay 繫結的簡化形式,在源值不更改的情況下可以提供更好的效能。


2:自定義轉換器
    在資料繫結這一章中,我們提到了資料模板的繫結,比如,將Student的姓名繫結到UI的TextBlock上。假設Student的性別是一個bool值,那我們該如何處理。一種方法是使用屬性觸發器,但這絕不是一種好方法,因為這樣一來,就會將業務邏輯放到UI層。一種更好的做法是使用自定義轉換器,當bool值為true的時候,在UI上就顯示“男”,否則,就顯示“女”。來看本例:
    首先,我們建立DateConverter類:
    程式碼片段1:

    [ValueConversion(typeof(bool), typeof(string))]
    public class DateConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            bool re = (bool)value;
            if (re)
            {
                return "";
            }
            else
            {
                return "";
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string strValue = value as string;
            if (strValue == "")
            {
                return true;
            }
            if (strValue == "")
            {
                return false;
            }
            return DependencyProperty.UnsetValue;
        }
    }

其次,在前臺,我們需要在資源中引用這個類:
程式碼片段2:

<Window.Resources>
<local:DateConverter x:Key="dateConverter"/>
</Window.Resources>
<StackPanel>
<TextBlock x:Name="tb" DataContext="{Binding}" Text="{Binding Path=Sex, Converter={StaticResource dateConverter}}" />
</StackPanel>

    經過自定義的轉換器,我們很好了解決了需求。需要注意的是,在程式碼片段1中,[ValueConversion(typeof(bool), typeof(string))],第一個型別是源型別,第二個型別是目標型別。
    為了更好的理解本例,將MSDN的相關注解COPY如下:
    如果要將值轉換器與繫結關聯,請建立一個實現 IValueConverter 介面的類,然後實現 Convert 和 ConvertBack 方法。 轉換器可以將資料從一種型別更改為另一種型別,根據區域性資訊轉換資料,或修改表示形式的其他方面。 有關某些典型的轉換器方案示例,請參見資料繫結概述中的“資料轉換”。 
    值轉換器是分割槽域性的。 Convert 和 ConvertBack 方法都具有指示區域性資訊的 culture 引數。 如果區域性資訊與轉換無關,那麼在自定義轉換器中可以忽略該引數。 
    Convert 和 ConvertBack 方法還具有名為 parameter 的引數,以便您能將轉換器的同一個例項與不同引數一起使用。 例如,您可以編寫格式設定轉換器,以根據所用的輸入引數生成不同的資料格式。 可以使用 Binding 類的 ConverterParameter,將引數作為變數傳遞給 Convert 和 ConvertBack 方法。

本文轉自最課程陸敏技部落格園部落格,原文連結:http://www.cnblogs.com/luminji/archive/2011/01/24/1943485.html,如需轉載請自行聯絡原作者

相關文章