C#访问同一类数据的两个表单

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

我正在使用MS Visual C#2010

我创建了两个WPF表单,MainWindow.xaml和CreateCharacter.xaml。我做了项目->添加类。。。添加一个名为Hero.cs的空类。英雄类将保存玩家姓名和其他重要数据

在MainWindow.xaml.cs中,我创建了一个Hero类的实例:
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();
}