數據綁定

通過把TextBox的Value綁定到Slider滾動條

<TextBox Text="{Binding Value,Mode=TwoWay,ElementName=slider1}"/>
<Slider x:Name="slider1"/>

Sliverlight中的數據綁定對被綁定對象有特殊要求,如果只是普通的get、set屬性的對象用在數據綁定上有很多問題(無法雙向綁定。只有Model值不會變或者Model變了不要求界面跟着變纔可以使用普通屬性),一般要求類實現INotifyPropertyChange接口。

一般實現後臺數據綁定到前臺的方法:

//MainPage類中定義
private Person p1 = new Person() { Name="", Age=12};
//在OnNavigatedTo中
txt1.DataContext = p1;
前臺:

<TextBox x:Name="txt1" Text="{Binding Name}"/>

Metro中的DependencyObject(依賴對象)沒有了事件通知機制,除了系統對象,自定義對象貌似建議使用INotifyPropertyChanged方式

public class Person:INotifyPropertyChanged
{
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
if(PropertyChanged != null)
{
PropertyChanged(this,new PorpertyChangedEventArgs("Name"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}

爲了簡化開發,可以自己寫一個BindableBase來簡化模型類的開發。

CallerMemberName是.Net4.5後新增的一個參數標註,用來傳遞調用這個方法的方法或者屬性名。


綁定模式

三種綁定模式:{Binding Name, Mode = OneTime}

OneTime:一次綁定,綁定創建時使用源數據更新控件。(可以使普通的set、get屬性)。

OneWay(默認值):單向綁定,在綁定創建時使用源數據更新控件,當源數據發生變化的時候也更新控件。(必須實現INotifyPropertyChanged接口或者繼承自DependencyObject)。相對於Eval

Twoway:雙向綁定,數據源的變化會更新控件,控件的變化也會更新數據源。(必須實現INotifyPropertyChanged接口或者繼承自DependencyObject)。相當於Bind


子層控件自動繼承最近父層控件的數據上下文DataContext:

//MainPage類中定義
private Person p1 = new Person() { Name="abc", Age=12};
//在OnNavigatedTo中
g1.DataContext = p1;//比this.DataContext = p1;優先
前臺:

<Grid Name="g1">
<TextBox x:Name="txt1" Text="{Binding Name}"/>
<TextBox x:Name="txt2" Text="{Binding Age}"/>
</Grid >

數據綁定到ListView

<ListView Name="lv1">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding Name}"></TextBox>
<TextBlock Text="{Binding Age}"></TextBlock>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

List<Person> list = new List<Person>();
//放數據
lv1.ItemsSource = list;


或者(前臺使用Binding直接綁定數據上下文DataContext)

<ListView Name="lv1" ItemsSource="{Binding}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding Name}"></TextBox>
<TextBlock Text="{Binding Age}"></TextBlock>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

lv1.DataContext = list;


關於ListView:

SelectionMode屬性表示選中模式:None不可選擇,Single單選,Multiple多選。

SelectedItem(s)可以獲得所有選中的項(如果是手動加入的Items,則值是點擊項的Content,如果是數據綁定的則是點擊項的DataContext)。

IsItemClickEnabled(默認false)設定點擊項的時候是否觸發ItemClick事件,ItemClick事件中e.ClickedItem可以得到點擊的項(如果是手動加入的Items,則值是點擊項的Content,如果是數據綁定的則是點擊項的DataContext)。

<ListView Name="lv1" IsItemClickEnabled="True"/>

lv1.ItemClick(object sender, ItemClickEventArgs e)
{
Person p = e.ClickedItem as Person;
}

ListBox類似於ListView,但是沒有ListView強大,Win8中不推薦使用ListBox


綁定數據集合

普通的集合的變化不會影響UI的,集合需要實現INotifyCollectionChanged接口

如果使用Oneway、TwoWay以達到數據源發生變化時UI中的項隨着數據變化,那麼數據可以放到private ObservableCollection<Book> books = new ObservableCollection<Book>(); 因爲ObservableCollection中定義了一個集合改變的通知時間。

this.listBox1.ItemsSource = books;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章