Это, вероятно, один из самых распространенных вопросов, когда-либо задаваемых на интернет-форумах.
Я предлагаю вам ознакомиться с объектно-ориентированным программированием перед погружением в программирование графического интерфейса, чтобы вы поняли основные понятия.
Чтобы передать объект в другое окно, вы можете добавить специальный конструктор, который принимает его в качестве параметра, а свойство или поле, чтобы держать его (в зависимости от того, хотите ли вы, чтобы сделать его доступным или нет):
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
«s страх и риск на самом деле экземпляр Character
, потому что он знает больше всего о его свойствах, и в любом случае нет никакого смысла в том, фиктивный характер, прежде чем пользователь нажмет Создать кнопку или что-то подобное, если вы не планируете использовать привязку данных ,
Если вы собираетесь использовать привязку данных, создать общедоступную для чтения Character
собственности в CreateCharacterWindow
так MainWindow
может получить доступ к его, создать его экземпляр в конструкторе, назначить экземпляр DataContext
объекта и проволочные элементы управления пользовательского интерфейса и свойств объекта в XAML разметке.
Но я бы не использовал привязку данных в этом случае.
Что бы я хотел сделать, это показать CreateCharacterWindow
modally с помощью метода 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
только будет создаваться, когда на самом деле является персонаж из бизнес-логики точки и объект не действует как какой-либо заполнитель, который может использоваться или не использоваться.
переход к конструктору - неправильный – Snowbear
@Snowbear - Почему это неправильно? –
@ Кирк, мы говорим о создании нескольких конструкторов? – Snowbear