1. 程式人生 > >看來還的一步一步來,首先要了解wpf的關鍵技術

看來還的一步一步來,首先要了解wpf的關鍵技術

這東西搞的我頭痛,我現在一定要讓自己記住。資料驅動!資料驅動!資料驅動!
只有把這個弄熟悉了,才能真正的下手啊。下面要不停的實驗
了。好了弄一個最簡單的見面。
這裡寫圖片描述
這個是最普通介面程式碼。(現在還沒有binding)

<Window x:Class="demo01.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="demo01" Height="400" Width
="400" >
<Grid ShowGridLines="True"> <Grid.RowDefinitions> <RowDefinition Height="3*"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition> </Grid.RowDefinitions> <TextBlock Name="tx_1" Grid.Row="0" Text="xaml設定的文字"
FontSize="24" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<Button Name="btn_1" Grid.Row="1" Content="測試" Height="60" Width="100" Margin="10"/> </Grid> </Window>

這個按鈕就用來測試,怎麼個數據驅動,用來改變我背後的資料,看這個文字是怎麼改變的。說到資料就先建立一個數據吧。名稱空間什麼都濾過了。建立一個book的類.

public class Book
    {
        string
name; public string Name { get { return name; } set { name = value; } } }//book

這樣建立好後,然後在主介面new 一個Book,再對Name賦值,但是這樣做好後是沒什麼軟用的,因為介面和資料根本就沒有聯絡。所以要進行三樣改造。先進行兩樣改造吧。

<TextBlock  Name="tx_1" Grid.Row="0"  Text="{Binding Name}" FontSize="24" HorizontalAlignment="Center" VerticalAlignment="Center"/>

把主介面的TextBlock給綁定了Name。

    public partial class Window1 : Window
    {
        Book bk;
        public Window1()
        {
            InitializeComponent();
            bk=new Book();
            bk.Name="你好";
            this.DataContext=bk;

        }
    }

這樣就進行了,資料繫結。當然this.DataContext=bk;這句話也可以這樣寫tx_1.DataContext=bk;this.DataContext就是整個去找文件去找name。

好了,然後用button去試著改變資料bk的name的值看看介面有沒有變化

        void btn_1_Click(object sender, RoutedEventArgs e)
        {
            bk.Name="按鈕改變文字";
            MessageBox.Show(bk.Name);
        }

然後發現數據的文字改變了,介面確沒有跟著改變(或者說跟新)。
這裡寫圖片描述

這就要說到第三樣的改造了,就是這個資料的改造了。book

public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChange(string propertyName){
    if (PropertyChanged != null) 
         { 
 PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
                } 
    }

想要資料有通知介面的功能上面是必寫的,除非改造介面,下面給出book的完整

using System;
using System.ComponentModel;
namespace demo01.ViewModels
{
    /// <summary>
    /// Description of Book.
    /// </summary>
    public class Book:INotifyPropertyChanged
    {
        string  name;

        public string  Name {
            get { return name; }
            set { 
                name = value; 
                NotifyPropertyChange("Name");
            }
        }


        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChange(string propertyName){
             if (PropertyChanged != null) 
                { 
                    //根據PropertyChanged事件的委託類,實現PropertyChanged事件: 
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
                } 
        }

    }//book
}

這個資料呢,繼承INotifyPropertyChanged
介面,NotifyPropertyChange(“Name”)

的意思就是當Name改變的時候通知介面binding的Name也改變。
這裡寫圖片描述

在點選按鈕的時候,成功的完成了,改變資料的時候,改變了,介面的內容。囉嗦了這麼多,就是想讓自己牢牢的記住wpf的模式是資料驅動的,為後面treeview
做準備。