C#访问同一类数据的两个表单
我正在使用MS Visual C#2010 我创建了两个WPF表单,MainWindow.xaml和CreateCharacter.xaml。我做了项目->添加类。。。添加一个名为Hero.cs的空类。英雄类将保存玩家姓名和其他重要数据 在MainWindow.xaml.cs中,我创建了一个Hero类的实例:C#访问同一类数据的两个表单,c#,wpf,C#,Wpf,我正在使用MS Visual C#2010 我创建了两个WPF表单,MainWindow.xaml和CreateCharacter.xaml。我做了项目->添加类。。。添加一个名为Hero.cs的空类。英雄类将保存玩家姓名和其他重要数据 在MainWindow.xaml.cs中,我创建了一个Hero类的实例:Hero player=new Hero()。我单击主窗口上的一个按钮,它将打开CreateCharacter表单。在CreateCharacter表单上,我想输入玩家名称并将此数据存储在p
Hero player=new Hero()代码>。我单击主窗口上的一个按钮,它将打开CreateCharacter表单。在CreateCharacter表单上,我想输入玩家名称并将此数据存储在player.name中,该文件在MainWindow中实例化
如何使我在MainWindow类中创建的Hero对象可用于CreateCharacter类 如果CreateCharacter表单正在创建角色,那么它可能应该创建Hero实例。它可以在CreateCharacter表单成功返回后,主表单可以读取的公共属性中返回它。如果CreateCharacter表单正在创建角色,那么它可能应该创建Hero实例。它可以在CreateCharacter窗体成功返回后,主窗体可以读取的公共属性中返回它。添加到您的CreateCharacter参数或Hero类的属性,并将其传递给其构造函数或任何其他方法。添加到您的CreateCharacter参数或Hero类的属性,并将其传递给构造函数或任何其他方法。这可能是互联网论坛上最常见的问题之一。
我建议您在深入GUI编程之前先熟悉面向对象编程,以便理解基本概念
要将对象传递给另一个窗口,可以添加一个特殊的构造函数,将其作为参数接受,并添加一个属性或字段来保存它(取决于是否要使其可访问):
不过,我碰巧不喜欢这种方法。
在即将显示的窗口中创建角色似乎是合乎逻辑的。在显示窗口之前创建对象有什么意义我相信CreateCharacterWindow
有责任实际实例化字符
,因为它最了解其属性,而且如果不打算使用数据绑定,在用户按下Create按钮或类似按钮之前使用虚拟字符是没有意义的
如果确实要使用数据绑定,请在CreateCharacterWindow
中创建一个公共只读Character
属性,以便MainWindow
可以访问它,在构造函数中实例化它,将实例分配给DataContext
对象,并在XAML标记中连接UI控件和对象属性
但在这种情况下我也不会使用数据绑定。
我要做的是使用showmodel
方法以模态方式显示CreateCharacterWindow
。在这个类中,如果用户选择实际创建角色(例如,与按下取消按钮相反),我会将this.DialogResult
设置为true
showmodel
将返回我们分配给DialogResult
的值,以便main窗口
知道用户是否真的想要创建角色。如果是这种情况,我们最后要求CreateCharacterWindow
创建Character
实例:
partial class CreateCharacterWindow : Window {
public CreateCharacterWindow ()
{
InitializeComponent ();
createButton.Click += (sender, e) => {
this.DialogResult = true;
this.Close ();
};
}
public Character CreateCharacter ()
{
return new Character {
Name = nameBox.Text
};
}
}
var createWindow = new CreateCharacterWindow ();
var doCreate = createWindow.ShowDialog ();
if (doCreate ?? false) { // if DialogResult was not specified, assume it's false
var character = createWindow.CreateCharacter ();
// do whatever you like with it
}
这种方法缺乏一些WPF数据绑定的想象力,但我喜欢只有从业务逻辑的角度来看确实存在字符时才会创建字符,并且对象的行为不像占位符,可能会使用,也可能不会使用。这可能是互联网论坛上最常见的问题之一。
我建议您在深入GUI编程之前先熟悉面向对象编程,以便理解基本概念
要将对象传递给另一个窗口,可以添加一个特殊的构造函数,将其作为参数接受,并添加一个属性或字段来保存它(取决于是否要使其可访问):
不过,我碰巧不喜欢这种方法。
在即将显示的窗口中创建角色似乎是合乎逻辑的。在显示窗口之前创建对象有什么意义我相信CreateCharacterWindow
有责任实际实例化字符
,因为它最了解其属性,而且如果不打算使用数据绑定,在用户按下Create按钮或类似按钮之前使用虚拟字符是没有意义的
如果确实要使用数据绑定,请在CreateCharacterWindow
中创建一个公共只读Character
属性,以便MainWindow
可以访问它,在构造函数中实例化它,将实例分配给DataContext
对象,并在XAML标记中连接UI控件和对象属性
但在这种情况下我也不会使用数据绑定。
我要做的是使用showmodel
方法以模态方式显示CreateCharacterWindow
。在这个类中,如果用户选择实际创建角色(例如,与按下取消按钮相反),我会将this.DialogResult
设置为true
showmodel
将返回我们分配给DialogResult
的值,以便main窗口
知道用户是否真的想要创建角色。如果是这种情况,我们最后要求CreateCharacterWindow
创建Character
实例:
partial class CreateCharacterWindow : Window {
public CreateCharacterWindow ()
{
InitializeComponent ();
createButton.Click += (sender, e) => {
this.DialogResult = true;
this.Close ();
};
}
public Character CreateCharacter ()
{
return new Character {
Name = nameBox.Text
};
}
}
var createWindow = new CreateCharacterWindow ();
var doCreate = createWindow.ShowDialog ();
if (doCreate ?? false) { // if DialogResult was not specified, assume it's false
var character = createWindow.CreateCharacter ();
// do whatever you like with it
}
这种方法缺乏一些WPF数据绑定的想象力,但我喜欢只有从业务逻辑的角度来看确实存在字符时才会创建字符,并且对象的行为不像某种占位符,可以使用,也可以不使用。这是一种非常常见的模式。我是这样想的
public bool CanEditCharacter { get { return SelectedCharacter != null; } }
public void EditCharacter()
{
EventHandler h = EditingCharacter;
if (EditingCharacter != null)
{
EditingCharacter(this, EventArgs.Empty);
}
}
private void ViewModel_EditingCharacter(object sender, EventArgs e)
{
CharacterViewModel cvm = ((MainWindowViewModel)sender).SelectedCharacter;
CharacterWindow cw = new CharacterWindow();
cw.ShowDialog(cvm);
}
public bool? ShowDialog(CharacterViewModel cvm)
{
DataContext = cvm;
return ShowDialog();
}