BillWoodruff
В той мере, в какой ваша цель, имхо, не полностью раскрыта, я собираюсь показать некоторый код, который отражает некоторые произвольные решения ... в надежде, что вы найдете эту стратегию и методы полезными :)
Я предлагаю вам использовать своего рода дизайн модели-вида:
using System.Collections.Generic;
using System.Drawing;
namespace YourNameSpace
{
public static class Model
{
public static Dictionary<UCPlayerAccount, PersonModel> PAcctToPModel =
new Dictionary<UCPlayerAccount, PersonModel>();
}
public class PersonModel
{
public PersonModel()
{
}
public PersonModel(int id, string firstName, string lastName, string nickName, int points, int currLevel,
int currClass, List<Image> avatars)
{
Id = id;
FirstName = firstName;
LastName = lastName;
NickName = nickName;
Points = points;
CurrLevel = currLevel;
CurrClass = currClass;
Avatars = avatars;
}
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string NickName { get; set; }
public int Points { get; set; }
public int CurrLevel { get; set; }
public int CurrClass { get; set; }
public List<Image> Avatars { get; set; } = new List<Image>();
public string FullName => $"{FirstName} {LastName}";
}
}
Класс статической модели сопоставляет каждый экземпляр UCPlayerAccount с экземпляром класса PersonModel: значения словаря вводятся при инициализации UCPlayerAccount(в событии Load):
using System;
using System.Drawing;
using System.Windows.Forms;
namespace YourNameSpace
{
public partial class UCPlayerAccount : UserControl
{
public UCPlayerAccount()
{
InitializeComponent();
}
public PersonModel PModel { set; get; } = new PersonModel();
private void UCPlayerAccount_Load(object sender, EventArgs e)
{
Model.PAcctToPModel.Add(this, PModel);
}
// note no external reference is kept to the instance of UCX
private void btnOpenUCX_Click(object sender, EventArgs e)
{
// reference to PModel injected into new instance of UCX
UCX ucx = new UCX(PModel);
this.Controls.Add(ucx);
ucx.Location = new Point(20,100);
}
}
}
Я не уверен, где вы хотите разместить UCX, поэтому я показываю его здесь созданным, помещенным внутри UCPlayerAccount:
using System
using System.Windows.Forms;
namespace YourNameSpace
{
public partial class UCX : UserControl
{
public UCX()
{
InitializeComponent();
}
// optional constructor
public UCX(PersonModel pmodel)
{
InitializeComponent();
PModel = pmodel;
}
// injected reference
private PersonModel PModel;
// test writing to PersonModel
private void btnWhatever_Click(object sender, EventArgs e)
{
if (PModel != null) PModel.Points = 100;
}
}
}
Демонстрирует, как PersonModel, связанный с UCPlayerAccount, может быть доступен из UCX.
Поскольку экземпляр UCX создается в области действия метода в UCPlayerAccount ... никакая ссылка не сохраняется "живой:" ... имхо, это согласуется с разделением интересов,
Хранение моделей данных вне представлений/элементов управления окупается, imho, во многих отношениях: например, модель статического класса может иметь коллекцию PersonModel, которая может быть сериализована, де-сериализована с использованием стандартных методов.