Это, наверное, один из самых распространенных вопросов, когда-либо задаваемых на интернет-форумах.
Я предлагаю вам ознакомиться с объектно-ориентированным программированием, прежде чем углубляться в программирование с графическим интерфейсом, чтобы вы понимали основные понятия.
Чтобы передать объект в другое окно, вы можете добавить специальный конструктор, который принимает его как параметр, и свойство или поле для его хранения (в зависимости от того, хотите ли вы сделать его доступным или нет):
partial class CreateCharacterWindow : Window {
private Character character;
public CreateCharacterWindow ()
: this (null) { } // designer requires parameterless constructor
public CreateCharacterWindow (Character character)
{
this.character = character;
InitializeComponent ();
}
}
var spiderman = new Character ();
var charWindow = new CreateCharacterWindow (spiderman);
Мне не нравится этот подход.
Кажется логичным, что вы намереваетесь создать персонажа в том самом окне, которое вы собираетесь показать. Какой смысл создавать объект перед показом окна? Я считаю, что ответственность CreateCharacterWindow
заключается в том, чтобы на самом деле создать экземпляр Character
, потому что он больше всего знает о своих свойствах , и в любом случае нет смысла иметь фиктивный символ, прежде чем пользователь нажмет кнопку Создать или что-то подобное, если вы не планируете использовать привязку данных.
Если вы намереваетесь использовать привязку данных, создайте общедоступное свойство Character
только для чтения в CreateCharacterWindow
, чтобы MainWindow
мог получить к нему доступ, создать его экземпляр в конструкторе, назначить экземпляр объекту DataContext
и подключить элементы управления пользовательского интерфейса. и свойства объекта в разметке XAML.
Но я бы и в этом случае не использовал привязку данных.
Я бы показал CreateCharacterWindow
модально с ShowModal
методом. В этом классе я бы установил this.DialogResult
на true
, если пользователь решит создать персонажа (например, вместо нажатия кнопки Отмена).
ShowModal
вернет значение, которое мы присвоили DialogResult
, поэтому MainWindow
знает, действительно ли пользователь хочет создать персонажа. Если это так, мы наконец просим 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, но мне нравится, что Character
создается только тогда, когда действительно является символом с точки зрения бизнес-логики, и объект не действует как некоторый заполнитель, который может использоваться или не использоваться.