位置:首頁 > 軟件操作教程 > 編程開發(fā) > C# > 問題詳情

C# 數(shù)據(jù)綁定 動(dòng)態(tài)綁定到外部對象

提問人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-09

    現(xiàn)在,可綁定到根據(jù)需要?jiǎng)討B(tài)創(chuàng)建的對象,以便為它們提供數(shù)據(jù)。在希望對一個(gè)現(xiàn)有實(shí)例化對象進(jìn)行數(shù)據(jù)綁定時(shí),我們應(yīng)該使用什么方法呢?這種情況下,需要在代碼中加一點(diǎn)料。

    以O(shè)ptions窗口為例,我們并不希望其中的選項(xiàng)在每次打開窗口時(shí)都被清除,而是希望用戶所做的選擇可以被保存下來,并且可用在應(yīng)用程序的其余部分。

在下面的示例代碼中將DataContext屬性的值設(shè)置為GameOptions類的實(shí)例,就可以實(shí)現(xiàn)該類的屬性的動(dòng)態(tài)綁定。


試一試創(chuàng)建動(dòng)態(tài)綁定:KarliCards.Gui\GameOptions.ds

在本例中,我們會(huì)將Options窗口中其余的控件與GameOptions實(shí)例綁定起來。

(1)打開OptionsWindow.xaml.cs 代碼隱藏文件。

(2)在構(gòu)造函數(shù)的底部,在InitializeComponent()這一行之前添加以下代碼:

    DataContext = gameOptions;

(3)轉(zhuǎn)到GameOptions類,對其進(jìn)行修改,如下所示:

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,然后按照如下方式進(jìn)行修改,刪除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)運(yùn)行該應(yīng)用程序。

示例說明

    將窗口的DataContext設(shè)置為GameOptions實(shí)例后,可以通過指定綁定中使用的屬性很方便地綁定到該實(shí)例。這就是在第(4)、(5)步中實(shí)現(xiàn)的。需要注意,ComboBox是通過一個(gè)靜態(tài)資源中的項(xiàng)來填充的,但選定的值在GameOptions實(shí)例中設(shè)置。

GameOptions類發(fā)生了較大變化。它實(shí)現(xiàn)了INotifyPropertyChanged接口,也就是說,當(dāng)屬性值發(fā)生變化時(shí),這個(gè)類就會(huì)通知WPF。為讓這個(gè)通知生效,我們需要讓訂閱方調(diào)用上述接口中定義的PropertyChanged事件。為此,屬性設(shè)置器必須主動(dòng)對它們進(jìn)行調(diào)用,這一調(diào)用是通過輔助方法OnPropertyChanged來實(shí)現(xiàn)的。

    調(diào)用OnPropertyChanged方法時(shí),使用了 C# 6引入的新表達(dá)式nameof。通過一個(gè)表達(dá)式調(diào)用nameof(...)時(shí),它將檢索最終標(biāo)識符的名稱。這在OnPropertyChanged方法中特別有用,因?yàn)樗岩牡膶傩悦鳛橐粋€(gè)字符串。

    OK按鈕的事件處理程序使用XmlSerializer將設(shè)置保存到磁盤中,而Cancel事件處理程序?qū)ameOptions字段設(shè)置為null,這樣可以確保用戶所做的選擇可以被清除掉。這兩個(gè)事件處理程序都會(huì)執(zhí)行關(guān)閉窗口的操作。

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部