Борьба с вложенными списками в c# - PullRequest
0 голосов
/ 24 марта 2020

Я работаю на многих неизвестных для меня территориях, так как я пытаюсь правильно следовать MVVM в этом проекте, а также правильно структурировать. Я создал следующий класс на основе того, как документ json будет размещен в будущем:

    public class SkinList
    {
        public class Coord
        {
            public string x { get; set; }
            public string y { get; set; }
        }

        public class Location
        {
            public string ID { get; set; }
            public string Name { get; set; }
            public List<Coord> Coords { get; set; }
            public string CodeNumber { get; set; }
            public string Description { get; set; }
        }

        public class Skin
        {
            public string ID { get; set; }
            public string Name { get; set; }
            public List<Location> Locations { get; set; }
        }

        public class RootObject
        {
            public List<Skin> Skins { get; set; }
        }
    }

Текущая страница создает новый скин (скин) при загрузке. Это позволяет пользователю нажимать на точку на изображении. Когда эта точка сгенерирована, я бы хотел создать новый объект Location (точку). Мне бы хотелось, чтобы на экране было несколько разных блоков для привязки к различным свойствам этого объекта. Моим следующим шагом будет выяснение всей вещи INotify, но я застрял на одной части. Я не могу понять, как прикрепить объект Location к списку Locations в объекте Skin. Я знаю, что мне просто не хватает логики c, которая, вероятно, очень прямолинейна.

Вот код, с которым я работаю:

{
    /// <summary>
    /// Interaction logic for ManikinEditor.xaml
    /// </summary>
    public partial class ManikinEditor : Page
    {
        public List<SkinList.Skin> skin = new List<SkinList.Skin>();

        private Ellipse elip = new Ellipse();
        private Point anchorPoint;
        private int Radius = 3;
        public ManikinEditor()
        {
            string guid = System.Guid.NewGuid().ToString();
            SkinList.Skin _skin = new SkinList.Skin();
            _skin.ID = guid;
            skin.Add(_skin);
            InitializeComponent();


        }
        private void Image_MouseLeftButtonDown_1(object sender, MouseButtonEventArgs e)
        {
            anchorPoint = e.MouseDevice.GetPosition(Cnv);
            //public List<SkinList.Skin
            //           SkinList.Location point = new SkinList.Location();
 //           List<SkinList.List> location = new List<SkinList.Locations>();
            SkinList.Location point = new SkinList.Location();
            string pointguid = System.Guid.NewGuid().ToString();
            point.ID = pointguid;
            Path test = new Path
            {
                Stroke = Brushes.Red,
                StrokeThickness = 1,
                Fill = Brushes.Black,
                Data = new EllipseGeometry { Center = anchorPoint, RadiusX = Radius, RadiusY = Radius }
            };

            Cnv.Children.Add(test);


        }

    }
}

После того, как я соберу все вместе, я сериализую всю вещь и добавлю ее в список (скины) в json файл, но я преодолею это препятствие, когда приду к нему.

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Хорошо. MVVM может быть немного пугающим при первой попытке, поэтому вот несколько указателей.

Созданные вами классы на самом деле являются моделью данных.

Вы должны пытаться и размещать только необходимый код поддерживать представление в его коде позади.

Программные логи c, такие как создание экземпляров класса Model и их настройка, должны выполняться внутри ViewModel, которая случайно реализует материал INotifyPropertyChanged.

Кстати, часто есть серая область вокруг необходимости отдельных классов Model и ViewModel.

Ваше представление должно иметь свойства Binding to ViewModel для данных и экземпляры ICommand для выполнения таких действий, как запуск определенного кода, например, json serialization.

В вашей ViewLodel SkinList должна быть ObservableCollection of Skins .

Лично я бы выделил свои классы так, чтобы они не были встроены друг в друга, поместил бы каждый в свой собственный файл.

Каждый класс должен иметь возможность создавать, удалять и иметь выбранный экземпляр класса, который он содержит в списке - это упростит связывание в XAML. например,

Не бойтесь реализовать ObservableCollections ViewModels или поместить ViewModels в ViewModels - задайте себе этот вопрос, хотите ли вы самостоятельно просмотреть местоположение, обложку или координату?

Если вы рассматривают возможность отображения нескольких скинов и расположений в одном пользовательском представлении, может ли это быть лучше всего достигнуто при наличии нескольких представлений в представлении или нескольких пользовательских пользовательских элементов управления в представлении?

Например, вы ищете наличие представления, которое имеет несколько слоев скинов на дисплее или только один?

edit

Самый простой способ передать координаты щелчка мышью обратно в ViewModel - использовать код захватить его и передать (вы можете сделать это через связывание в XAML, это немного сложнее).

ViewModel - это BindingContext представления (страницы) (это может быть установлено в XAML или в коде позади). В коде он обычно передается через конструктор.

Затем вы должны ссылаться на это с помощью вашего обработчика Image_MouseLeftButtonDown_1 и вызывать команду, передавая координаты в качестве параметра команды.

Использование ICommands и привязки помогает отсоединить интерфейс пользователя и программный код таким образом, чтобы они также могли работать в разных потоках, поддерживая отзывчивость вашего интерфейса.

0 голосов
/ 24 марта 2020

Вид ответил на мой собственный вопрос. Это был просто случай, когда я рассматривал объект списка как объект класса (не уверен, что моя формулировка верна, я довольно новый). Вот обновленный код, который, кажется, работает до сих пор:

    public partial class ManikinEditor : Page
    {
        public SkinList.Skin skin = new SkinList.Skin();
        List<SkinList.Location> location = new List<SkinList.Location>();
        private Ellipse elip = new Ellipse();
        private Point anchorPoint;
        private int Radius = 3;
        public ManikinEditor()
        {
            string guid = System.Guid.NewGuid().ToString();
            skin.ID = guid;
            InitializeComponent();


        }
        private void Image_MouseLeftButtonDown_1(object sender, MouseButtonEventArgs e)
        {
            anchorPoint = e.MouseDevice.GetPosition(Cnv);
            //public List<SkinList.Skin
            //           SkinList.Location point = new SkinList.Location();

            SkinList.Location point = new SkinList.Location();
            SkinList.Coord coord = new SkinList.Coord();
            coord.x = (int)anchorPoint.X;
            coord.y = (int)anchorPoint.Y;
            string pointguid = System.Guid.NewGuid().ToString();       
            point.ID = pointguid;
            point.Coords = coord;
            location.Add(point);
            //           skin.Add(location);
            skin.Locations = location;
            Path test = new Path
            {
                Stroke = Brushes.Red,
                StrokeThickness = 1,
                Fill = Brushes.Black,
                Data = new EllipseGeometry { Center = anchorPoint, RadiusX = Radius, RadiusY = Radius }
            };

            Cnv.Children.Add(test);


        }

    }

Я полагаю, было бы еще одно продолжение, если этот код подходит для кода после модели MVVM? Я не знаю, отвечает ли этот вопрос на самом деле, учитывая ограниченный код, но на этот раз я стараюсь быть хорошим и делаю это правильно.

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