文章目錄
-
-
-
-
- 元素綁定
- 資料綁定
- 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));
}
}