看來還的一步一步來,首先要了解wpf的關鍵技術
阿新 • • 發佈:2019-01-24
這東西搞的我頭痛,我現在一定要讓自己記住。資料驅動!資料驅動!資料驅動!
只有把這個弄熟悉了,才能真正的下手啊。下面要不停的實驗
了。好了弄一個最簡單的見面。
這個是最普通介面程式碼。(現在還沒有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
做準備。