天天看點

WPF資料綁定

文章目錄

          • 元素綁定
          • 資料綁定
          • INotifyPropertyChanged
          • 特性
元素綁定
資料綁定最簡單的形式是,源對象是WPF元素而且源屬性是依賴屬性。依賴項屬性具有内置的更改通知支援,當在源對象中改變依賴項屬性的值時,會立即更新目标對相中的綁定屬性。
<!--Xaml程式 -->
<Grid>
	<StackPanel>
		<Button x:Name="btn"  Margin="20" Click="btn_Click" Width="40"  Height="35"/>
		<TextBox  Text="{BindingElementName=txt2,Path=Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
		<!-- TextBox綁定屬性名為txt2,綁定其Text,雙向綁定,屬性改變時更新 -->
		<TextBlock x:Name="txt2" />
	</StackPanel>
</Grid>
           
//背景程式

public partial class MainWindow : Window
{
	public MainWindow()
	{
		InitializeComponent();
	}

	private void btn_Click(object sender, RoutedEventArgs e)
	{
		txt2.Text += "k";
	}
}
           

BindingMode枚舉值

名稱 說明
OneWay 當源屬性變化時更新目标屬性
TwoWay 當源屬性變化時更新目标屬性,當目标屬性變化時更新源屬性
OneTime 最初根據源屬性設定目标屬性,其後的改變會忽略。
OneWayToSource 與OneWay類型相似,但方向相反。
Default 此類綁定依賴于目标屬性

UpdateSourceTrigger

名稱 說明
Default 預設值,與依賴屬性有關
Explicit 必須在顯示地調用BindingExpression.UpdateSource的情況下才更新源。
LostFocus 控件失去焦點的時候更新源值
PropertyChanged 綁定的目标值改變時更新。
資料綁定
<!-- Xaml程式 -->
<Grid>
	<StackPanel>
		<DataGrid ItemsSource="{Binding PerList}" IsReadOnly="True"></DataGrid>
		<ComboBox x:Name="com" ItemsSource="{Binding PerList}" DisplayMemberPath="Name" Margin="10" Width="80" Height="30"/>
		<!--綁定PerList,展示其Name屬性 -->
	</StackPanel>
</Grid>
           
//背景程式
public partial class MainWindow : Window
{
	public List<string> LT { get; set; }
	List<Person> Perss { get; set; }

	public MainWindow()
	{
		PersonList perlist = new PersonList();  //建立一個PersonList對象
		Perss = new List<Person>() { new Person("Getsu1","男"), new Person("Getsu2", "男"), new Person("Getsu3", "男")};
		perlist.PerList = Perss; //給PerList屬性指派
		this.DataContext = perlist; //将perlist加入上下文,設定之後綁定才會有效
	}
}

public class PersonList
{
	public List<Person> PerList { get; set; }
	public PersonList()
	{
		PerList = new List<Person>();
	}
	public class Person
	{
		private string _name;
		private string _sex;
		public string Name
		{
			get { return _name; }
			set{ _name = value; }
		}		
		public string Sex
		{
			get { return _sex; }
			set{ _sex = value; }
		}
		public Person(string name, string sex)
		{
			Name = name;
			Sex = sex;
		}
	}
}
           
INotifyPropertyChanged
屬性更改通知接口。向用戶端發出某一屬性已更改的通知。

event PropertyChangedEventHandler PropertyChanged;

PropertyChanged 在屬性改變時發生。
<!-- X -->
 <StackPanel>
	<TextBox Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>
	<TextBox Text="{Binding Sex,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>

	<TextBlock Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
	<!-- 不會随着TextBox内容的改變而改變-->
	<TextBlock Text="{Binding Sex,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
	<!-- 會随着TextBox内容的改變而改變-->
</StackPanel>
           
//背景程式
public partial class MainWindow : Window
{
	public MainWindow()
	{
		Person per = new Person("kakarot", "Male");
		this.DataContext = per;
		InitializeComponent();
	}
}

public class Person : INotifyPropertyChanged
{
	public event PropertyChangedEventHandler PropertyChanged;
	private string _name;
	private string _sex;

	public string Name
	{
		get { return _name; }
		set
		{
			_name = value;
			//NotifyPropertyChanged("Name");
		}
	}

	public string Sex
	{
		get { return _sex; }
		set
		{
			_sex = value;
			NotifyPropertyChanged("Sex");
		}
	}
	private void NotifyPropertyChanged(String info)
	{
		if (PropertyChanged != null)
		{
			PropertyChanged(this, new PropertyChangedEventArgs(info));
		}
	}
	public Person(string name, string sex)
	{
		Name = name;
		Sex = sex;
	}
}

           
特性
public string Sex
{
	get { return _sex; }
	set
	{
		_sex = value;
		NotifyPropertyChanged();
		//使用特性之後可以自動擷取屬性名
	}
}
									//特性的表示
private void NotifyPropertyChanged([CallerMemberName]String info="預設值")
{
	if (PropertyChanged != null)
	{
		PropertyChanged(this, new PropertyChangedEventArgs(info));
	}
}