C# 數(shù)據(jù)綁定 動態(tài)綁定到外部對象
現(xiàn)在,可綁定到根據(jù)需要動態(tài)創(chuàng)建的對象,以便為它們提供數(shù)據(jù)。在希望對一個現(xiàn)有實例化對象進行數(shù)據(jù)綁定時,我們應該使用什么方法呢?這種情況下,需要在代碼中加一點料。
以Options窗口為例,我們并不希望其中的選項在每次打開窗口時都被清除,而是希望用戶所做的選擇可以被保存下來,并且可用在應用程序的其余部分。
在下面的示例代碼中將DataContext屬性的值設置為GameOptions類的實例,就可以實現(xiàn)該類的屬性的動態(tài)綁定。
試一試創(chuàng)建動態(tài)綁定:KarliCards.Gui\GameOptions.ds
在本例中,我們會將Options窗口中其余的控件與GameOptions實例綁定起來。
(1)打開OptionsWindow.xaml.cs 代碼隱藏文件。
(2)在構(gòu)造函數(shù)的底部,在InitializeComponent()這一行之前添加以下代碼:
DataContext = gameOptions;
(3)轉(zhuǎn)到GameOptions類,對其進行修改,如下所示:
using System;
using System.ComponentModel;
namespace KarliCards.Gui
{
[Serializable]
public class GameOptions
{
private bool playAgainstComputer = true;
private int numberOfPlayers = 2;
private ComputerSki11Level computerSkill = ComputerSkillLevel,Dumb;
public int NumberOfPlayers
{
get { return numberOfPlayers; }
set
{
numberOfPlayers = value;
OnPropertyChanged(nameof(NumberOfPlayers));
}
}
public bool PlayAgainstComputer
{
get { return playAgainstComputer; }
set
{
playAgainstComputer = value;
OnPropertyChanged(nameof(PlayAgainstComputer));
}
}
public Conipu ter Ski 11 Level Computer Skill
{
get { return computerSkill;)
set
{
computerSkill = value;
OnPropertyChanged(nameof(ComputerSkill));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string oropertyName)
{
PropertyChanged?.Invoke(this, new
PropertyChangedEventArgs(propertyName));
}
}
[Serializable]
public enum ComputerskillLevel
{
Dumb,
Good,
Cheats
}
}
(4)返回OptionsWindow.xaml文件,選擇CheckBox,然后添加IsChecked屬性,如下所示:
IsChecked="{Binding Path=PIayAaainstComputer}"
(5)選擇ComboBox,然后按照如下方式進行修改,刪除Selectedlndex屬性,修改ItemsSource和SelectedValue屬性:
<ComboBox Hori2ontalAlignment="Left" Margin="196,58,0,0" VerticalAlignment="Top"
Width="86" Name="numberOfPlayersComboBox"
ItemsSource="{Binding Source={StaticResource numberOfPlayersData}}"
SelectedValue="{Binding Path=NumberOfPlayers}" />
(6)運行該應用程序。
示例說明
將窗口的DataContext設置為GameOptions實例后,可以通過指定綁定中使用的屬性很方便地綁定到該實例。這就是在第(4)、(5)步中實現(xiàn)的。需要注意,ComboBox是通過一個靜態(tài)資源中的項來填充的,但選定的值在GameOptions實例中設置。
GameOptions類發(fā)生了較大變化。它實現(xiàn)了INotifyPropertyChanged接口,也就是說,當屬性值發(fā)生變化時,這個類就會通知WPF。為讓這個通知生效,我們需要讓訂閱方調(diào)用上述接口中定義的PropertyChanged事件。為此,屬性設置器必須主動對它們進行調(diào)用,這一調(diào)用是通過輔助方法OnPropertyChanged來實現(xiàn)的。
調(diào)用OnPropertyChanged方法時,使用了 C# 6引入的新表達式nameof。通過一個表達式調(diào)用nameof(...)時,它將檢索最終標識符的名稱。這在OnPropertyChanged方法中特別有用,因為它把要更改的屬性名作為一個字符串。
OK按鈕的事件處理程序使用XmlSerializer將設置保存到磁盤中,而Cancel事件處理程序?qū)ameOptions字段設置為null,這樣可以確保用戶所做的選擇可以被清除掉。這兩個事件處理程序都會執(zhí)行關(guān)閉窗口的操作。
點擊加載更多評論>>