1. 程式人生 > >WPF資料繫結小結

WPF資料繫結小結

目錄

 

1、資料繫結

1.1 定義

1.2 繫結語法

1.2.1 標記擴充套件使用

1.2.1 物件元素語法

1.3 繫結資料來源型別

1.4 繫結資料流方向

1.5 繫結到集合

2、資料轉換介面

2.1 單值轉換介面IValueConverter

2.2 多值轉換介面IMultiValueConverter

2.3 轉換版本屬性ValueConversion


1、資料繫結

1.1 定義

Windows Presentation Foundation (WPF) 資料繫結為應用程式呈現資料並與資料互動提供了一種簡單且一致的方式。資料繫結是在應用程式

 UI 和業務邏輯之間建立連線的過程。

 

 

1.2 繫結語法

1.2.1 標記擴充套件使用

 

1.2.1 物件元素語法

 

1.3 繫結資料來源型別

常用的型別有:

物件型別

描述

公共語言執行時 (CLR) 物件

可以繫結到任何 公共語言執行時 (CLR) 物件的公有屬性、子屬性以及索引器

動態物件

可以將繫結到可用的屬性和索引器的實現的物件IDynamicMetaObjectProvider介面。如果可以訪問程式碼中的成員,則可以繫結到該成員。 例如,如果動態物件使使用者可以通過 someObjet.AProperty 訪問程式碼中的成員,則可以通過將繫結路徑設定為 AProperty 來繫結到該成員。

ADO.NET 物件

可以將繫結到ADO.NET物件,如DataTable。

XML 物件

你可以將繫結到並執行XPath查詢上XmlNode, XmlDocument,或XmlElement。

DependencyObject物件

可以繫結到的任何依賴項屬性DependencyObject。 

DependencyObject物件是指類似於Button、Lable等這些繼承了DependencyObject類的類物件。此型別常用於控制元件與控制元件之間的繫結,例如:

 

1.4 繫結資料流方向

資料流方向:

示例:

 

 

1.5 繫結到集合

繫結到一個集合,使用派生自ObservableCollection<T>類,它是一個集合類,可在新增或刪除項時提供通知。

參考地址:https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/data/how-to-create-and-bind-to-an-observablecollection

程式碼:

    public class CollectionSource : ObservableCollection<Item>
    {
        public CollectionSource() : base()
        {
            Add(new Item() { DM = "0", MC = "預設" });
            Add(new Item() { DM = "1", MC = "型別一" });
            Add(new Item() { DM = "2", MC = "型別二" });
        }
    }

    public class Item
    {
        public string MC { get; set; }

        public string DM { get; set; }

        public override string ToString()
        {
            return MC;
        }
    }

XAML:

 <Window.Resources>
        <local:CollectionSource x:Key="myItemsSource"/>
 </Window.Resources> 
<ComboBox x:Name="comboBox" HorizontalAlignment="Left" Margin="10,134,0,0" VerticalAlignment="Top" Width="186"
                 ItemsSource="{Binding Source={StaticResource myItemsSource}}" />

2、資料轉換介面

2.1 單值轉換介面IValueConverter

在使用列舉、布林、日期、字典型別的情況下,UI元素顯示的內容需要對繫結的資料型別進行轉譯。

示例:

對字典型別的資料定義了個基類,是具體使用的地方就不用寫那麼多程式碼了:

public class DictionaryConverter<T1, T2> : IValueConverter
    {
        protected Dictionary<T1, T2> m_DicDataItems;

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (m_DicDataItems.Keys.Contains((T1)value))
            {
                return m_DicDataItems[(T1)value];
            }

            return DependencyProperty.UnsetValue;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (m_DicDataItems.Values.Contains((T2)value))
            {
                return m_DicDataItems.Keys.First((key) => m_DicDataItems[key].Equals((T2)value));
            }

            return DependencyProperty.UnsetValue;
        }
    }

應用程式碼:

   public class ConverterClass : DictionaryConverter<string, string>
    {
        public ConverterClass()
        {
            m_DicDataItems = new Dictionary<string, string>();
            m_DicDataItems.Add("1", "那是1");
            m_DicDataItems.Add("2", "那是2");
            m_DicDataItems.Add("3", "那是3");
        }
    }

XAML:

 

2.2 多值轉換介面IMultiValueConverter

當介面元素由資料來源多個屬性共同確定時需要用到多值轉換,譬如控制元件的背景色由繫結物件的R、G、B三個屬性確定。

示例:

public class BrushSource
    {
        private int m_R = 50;
        private int m_G = 120;
        private int m_B = 30;

        public int R
        {
            get
            {
                return m_R;
            }
            set
            {
                m_R = value;
            }
        }

        public int G
        {
            get
            {
                return m_G;
            }
            set
            {
                m_G = value;
            }
        }

        public int B
        {
            get
            {
                return m_B;
            }

            set
            {
                m_B = value;
            }
        }
    }

UI:背景色

 

2.3 轉換版本屬性ValueConversion

用於指定轉換的型別。

[ValueConversion(typeof(Color), typeof(SolidColorBrush))]
public class ColorBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Color color = (Color)value;
        return new SolidColorBrush(color);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}

 

參考地址:

https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/index