Member 14922487 Ответов: 2

Доступ и обновление значения свойства класса из пользовательского элемента управления C# windows forms


У меня есть пользовательский элемент управления под названием UCPlayerAccount, в котором я создал "модель", экземпляр класса PersonModel, и заполнил его значениями.
Теперь в UCPlayerAccount у меня есть кнопка, которая загружает другой пользовательский элемент управления, скажем, он называется UCX, с собственной логикой создания некоторых задач для пользователя.
Когда пользователь подтверждает ответы, я хочу суммировать баллы со значением из модели.Свойство Points, но в UCX я не могу получить доступ к экземпляру "model", так как он находится из предыдущего пользовательского элемента управления, то есть из UCPlayerAccount.
Я использую C# Windows Form.
Это мой класс PersonModel:
public class PersonModel
    {
        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<AvatarPicture> Avatars { get; set; } = new List<AvatarPicture>();


        public string FullName
        {
            get { return $"{ FirstName } { LastName }"; }

        }
    }


Что я уже пробовал:

Как получить доступ к "модели" в UCX, может ли кто-нибудь помочь?

2 Ответов

Рейтинг:
5

OriginalGriff

Вы "инкапсулировали" свою модель Person, поэтому либо предоставьте свойство, чтобы вернуть его из вашего UserControl, либо напишите метод, который возвращает конкретный экземпляр.


Member 14922487

Хорошо, это то, о чем я думал, но не могли бы вы дать мне какой-нибудь совет, как это сделать?
Чтобы сделать его простым, Я хочу предоставить UCX "модель".

Рейтинг:
12

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


Sandeep Mewara

+5