C # две формы доступа к одним и тем же данным класса - PullRequest
0 голосов
/ 06 февраля 2011

Я использую MS Visual C # 2010.

Я создал 2 формы WPF, MainWindow.xaml и CreateCharacter.xaml.Я сделал Project-> Add Class ..., чтобы добавить пустой класс с именем Hero.cs.Класс Hero будет содержать имя игрока и другие важные данные.

В MainWindow.xaml.cs я сделал экземпляр класса Hero: Hero player = new Hero();.Я нажимаю кнопку в MainWindow, и она открывает форму CreateCharacter.В форме CreateCharacter я хочу ввести имя игрока и сохранить эти данные в player.name, который был создан в MainWindow.

Как сделать объект Hero, который я создал в классе MainWindow, доступным для класса CreateCharacter?

Ответы [ 4 ]

3 голосов
/ 06 февраля 2011

Если форма CreateCharacter создает персонажа, то, возможно, она должна создать экземпляр Hero. Он может вернуть его в открытое свойство, которое основная форма может прочитать после успешного возврата формы CreateCharacter.

1 голос
/ 06 февраля 2011

Это, наверное, один из самых распространенных вопросов, когда-либо задаваемых на интернет-форумах.
Я предлагаю вам ознакомиться с объектно-ориентированным программированием, прежде чем углубляться в программирование с графическим интерфейсом, чтобы вы понимали основные понятия.

Чтобы передать объект в другое окно, вы можете добавить специальный конструктор, который принимает его как параметр, и свойство или поле для его хранения (в зависимости от того, хотите ли вы сделать его доступным или нет):

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 создается только тогда, когда действительно является символом с точки зрения бизнес-логики, и объект не действует как некоторый заполнитель, который может использоваться или не использоваться.

0 голосов
/ 06 февраля 2011

Это довольно распространенный паттерн. Вот как я это сделаю в WPF.

В модели представления для главного окна должно быть свойство с именем Characters, это ObservableCollection<CharacterViewModel>. По мнению, это связано с каким-то контролем элементов, скажем, ListBox. Существует либо DataTemplate для CharacterViewModel, либо класс реализует ToString(), так что символы представлены с пользой. Свойство SelectedItem ListBox привязано к свойству SelectedCharacter в модели представления, поэтому всякий раз, когда пользователь щелкает элемент в списке, модель представления знает, что представляет собой выбранный в данный момент символ.

Модель представления основного окна также реализует событие EditingCharacter (это просто обычный обработчик событий) и EditCharacterCommand (используя шаблон RelayCommand Джоша Смита ), а также сопутствующие свойство и метод Например:

public bool CanEditCharacter { get { return SelectedCharacter != null; } }

public void EditCharacter()
{
   EventHandler h = EditingCharacter;
   if (EditingCharacter != null)
   {
      EditingCharacter(this, EventArgs.Empty);
   }
}

EditCharacterCommand привязан к интерактивному элементу управления (например, к кнопке или гиперссылке) в представлении.

Главное окно view создает экземпляр модели основного окна и регистрирует обработчик для события EditingCharacter:

private void ViewModel_EditingCharacter(object sender, EventArgs e)
{
   CharacterViewModel cvm = ((MainWindowViewModel)sender).SelectedCharacter;
   CharacterWindow cw = new CharacterWindow();
   cw.ShowDialog(cvm);
}

(Зачем использовать событие? Поскольку использование событий сохраняет детали реализации создания и отображения окон за пределами объектов модели представления. CharacterViewModel не нужно знать какие-либо подробности о том, как редактируются символы. Он просто вызывает Событие со словами «эй, пришло время редактировать выбранного в данный момент персонажа. Это зависит от главного окна, чтобы решить, что он собирается делать, когда событие возникает.)

CharacterWindow - это то, что фактически позволяет пользователю редактировать персонажа. Его элементы управления привязаны к свойствам CharacterViewModel. Он реализует перегрузку ShowDialog:

public bool? ShowDialog(CharacterViewModel cvm)
{
   DataContext = cvm;
   return ShowDialog();
}

(Возможность отменить это диалоговое окно без сохранения изменений - упражнение для читателя.)

Наконец, также реализует AddCharacterCommand в модели представления окна - он создает новый CharacterViewModel, добавляет его в коллекцию Characters, устанавливает SelectedCharacter и поднимает EditingCharacter. Свяжите это с кнопкой, гиперссылкой или пунктом меню в главном окне, и все готово.

0 голосов
/ 06 февраля 2011

добавьте к вашему аргументу CreateCharacter или свойству класса Hero и передайте его своему конструктору или любому другому методу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...