位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# 数据绑定 动态绑定到外部对象

提问人:刘团圆发布时间:2020-12-09

    现在,可绑定到根据需要动态创建的对象,以便为它们提供数据。在希望对一个现有实例化对象进行数据绑定时,我们应该使用什么方法呢?这种情况下,需要在代码中加一点料。

    以Options窗口为例,我们并不希望其中的选项在每次打开窗口时都被清除,而是希望用户所做的选择可以被保存下来,并且可用在应用程序的其余部分。

在下面的示例代码中将DataContext属性的值设置为GameOptions类的实例,就可以实现该类的属性的动态绑定。


试一试创建动态绑定:KarliCards.Gui\GameOptions.ds

在本例中,我们会将Options窗口中其余的控件与GameOptions实例绑定起来。

(1)打开OptionsWindow.xaml.cs 代码隐藏文件。

(2)在构造函数的底部,在InitializeComponent()这一行之前添加以下代码:

    DataContext = gameOptions;

(3)转到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)步中实现的。需要注意,ComboBox是通过一个静态资源中的项来填充的,但选定的值在GameOptions实例中设置。

GameOptions类发生了较大变化。它实现了INotifyPropertyChanged接口,也就是说,当属性值发生变化时,这个类就会通知WPF。为让这个通知生效,我们需要让订阅方调用上述接口中定义的PropertyChanged事件。为此,属性设置器必须主动对它们进行调用,这一调用是通过辅助方法OnPropertyChanged来实现的。

    调用OnPropertyChanged方法时,使用了 C# 6引入的新表达式nameof。通过一个表达式调用nameof(...)时,它将检索最终标识符的名称。这在OnPropertyChanged方法中特别有用,因为它把要更改的属性名作为一个字符串。

    OK按钮的事件处理程序使用XmlSerializer将设置保存到磁盘中,而Cancel事件处理程序将GameOptions字段设置为null,这样可以确保用户所做的选择可以被清除掉。这两个事件处理程序都会执行关闭窗口的操作。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部