• При тестировании вылетает InvalidOperationException, почему исключения вылетает только при тестировании?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Причина очевидна - в тестах нет STAThread, вот и не работает ни просто так, ни через Dispatcher.
    Если ты используешь NUnit, то можешь поставить атрибут [Apartment(ApartmentState.STA)]
    Если используешь xUnit, то [STAFact] или [STATheory]
    Ответ написан
    Комментировать
  • Куда записывается информация о проекте до начала этапа кодирования?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Техническое задание.
    Ответ написан
    Комментировать
  • Как обратиться к ListBox из кода?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вам не нужно делать кастомный контрол для листбокса, такое поведение делается по другому:
    1) создаётся класс Anime, в котором нужно указать необходимые свойства аниме - Название, рейтинг, автор, серия, ссылка на скачивание и пр.
    2) создаётся вьюмодель окна (или части окна),
    2.1) во вьюмодели нужно сделать коллекцию объектов аниме (можно и List, но лучше ObservableCollection)
    3) вьюмодель указывается в окно как датаконтекст (тут есть несколько вариантов, ниже покажу самый прсотой вариант)
    4) привязать коллекцию аниме к списку ListBox, и указать имя свойства для показа (тут, видимо - Название).
    5) всё, список готов - будет видно в окне. Осталось получить конкретный элемент и его свойства - объект класса Anime указано в свойстве DataContext элемента списка (ListBoxItem) и остаётся привести к нужному классу:
    var anime = (Anime)AnimeListBox.Items.First().DataContext;
    Console.WriteLine(anime.Name + " " + anime.Rating);

    class Anime
    {
        public string Name {get; set;}
        public double Rating {get; set;}
        public string Author {get; set;}
        public string Serie {get; set;}
        public string Url {get; set;}
    }
    class AnimeListViewModel
    {
        public ObservableCollection<Anime> AnimeList {get; set;} = new ObservableCollection<Anime>
        {
            new Anime { Name = "Наруто",  Rating = 5, Author = "Масаси Кисимото"},
            new Anime { Name = "Стальной алхимик",  Rating = 5, Author = "Хирому Аракава"},
            new Anime { Name = "X",  Rating = 5, Author = "CLAMP"},
        };
    }


    <Window ...
        xmlns:app="clr-namespace:Anime">
        <Window.DataContext>
            <app:AnimeListViewModel/>
        </Window.DataContext>
        <Grid>
            <ListBox ItemsSource="{Binding AnimeList}"
                     DisplayMemberPath="Name"/>
                     x:Name="AnimeListBox"/>
        </Grid>
    </Window>
    Ответ написан
    Комментировать
  • Какие есть способы у ViewModel привязать Model ко View?

    yarosroman
    @yarosroman Куратор тега C#
    C# the best
    Конечно MVVM можно реализовывать и с нуля, но проще взять готовый фреймворк, в котором реализованы, навигация, DI/IoC, MessageBus. И грубо говоря, указывая навигатору переход на экран, он сам берет из DI контейнера вьюмодель, находит представление, делает привязку. Caliburn, Prism, самые популярные.
    Ответ написан
    Комментировать
  • Какие есть способы у ViewModel привязать Model ко View?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Модель описывает данные. Представление определяет внешний вид экрана. Вьюмодель - это модель, которая предназначена для использования данных из модели внутри представления, причём во вьюмодели можно добавлять какие-то поля только для удобства представления. Одна вьюмодель вполне может использовать несколько разных моделей.

    Первейший путь для показа данных в представлении - привязка (биндинг) данных, а также - специальные поля контрола (например, DisplayMemberPath).
    Команды используются для обратной связи от пользователя в представлении во вьюмодель.
    Свойства зависимости сами по себе обычно не используются напрямую, а просто добавляют возможностей для биндинга.
    Расширения разметки дают связывать несколько классов в одном контроле.

    В представлении вполне можно обойтись без вьюмодели, используя саму модель (передав её как датаконтекст). Но у модели обычно нет интерфейса INotifyPropertyChanged, и вьюмодель как раз реализует её для использования биндинга, а также добавляет команды и доп.свойства. Для одной модели вполне может быть несколько вьюмоделей, по одному для представлений, или наоборот, одна вьюмодель вполне может подходить для нескольких представлений.

    В примере можно увидеть, что в представлении можно использовать как свойства вьюмодели, так и исходные данные модели.

    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string MiddleName { get; set; }
    }
    public class EditPersonVm : BaseViewModel // который реализует INotifyPropertyChanged
    {
        private readonly Person _person;
        public Person Person => _person;
    
        private string _firstName;
        public string FirstName
        {
            get => _firstName;
            set { _firstName = value; RaisePropertyChanged(); }
        }
        private string _lastName;
        public string LastName 
        {
            get => _lastName;
            set { _lastName= value; RaisePropertyChanged(); }
        }
        private string _middleName;
        public string MiddleName 
        {
            get => _middleName;
            set { _middleName= value; RaisePropertyChanged(); }
        }
    
        public string InitFullName => $"{_person.LastName} {_person.FirstName[0]}. {_person.MiddleName[0]}.";
    
        public RelayCommand OkButton { get; set; } = new RelayCommand(Save);
    
        public EditPersonVm(Person person)
        {
            _person = person;
            FirstName = person.FirstName;
            LastName = person.LastName;
            MiddleName = person.MiddleName;
        }
    
        private void Save()
        {
            //
        }
    }

    <Window ...>
        <StackPanel Orientation="Vertical">
            <Label Content="Изначальное имя:"/>
            <StackPanel>
                <TextBlock Text="{Binding Person.LastName}"/>
                <TextBlock> </TextBlock>
                <TextBlock Text="{Binding Person.FirstName}"/>
                <TextBlock> </TextBlock>
                <TextBlock Text="{Binding Person.MiddleName}"/>
            </StackPanel>
            <Label Content="Фамилия:"/>
            <TextBox Text="{Binding LastName, UpdateSourceTrigger=PropertyChanged}"/>
            <Label Caption="Имя:"/>
            <TextBox Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged}"/>
            <Label Caption="Отчество:"/>
            <TextBox Text="{Binding MiddleName, UpdateSourceTrigger=PropertyChanged}"/>
            <Button Content="OK"  Command="{Binding OkCommand}">
        </StackPanel>
    </Window>
    Ответ написан
    Комментировать
  • Unity3d | как создать дочерний объект скриптом?

    Griboks
    @Griboks Куратор тега C#
    Прочитайте документацию про instantiate. Там всё написано.
    Ответ написан
    6 комментариев
  • Для чего нужны указатели в c#?

    Для чего нужны:
    Чтобы получить адрес ячейки в памяти, где находится начало переменной или функции.

    Как используются:
    • Для оптимизации алгоритмов (например, превратить массив байт в массив интов отбрасывая проверки и сборщик мусора)
      + битовые операции с адресом (например, чтобы мгновенно найти адрес середины массива)
    • Для работы с библиотеками написанными на других языках (например, сишная функция принимает указатель)
    • Для использования SIMD
    Ответ написан
    Комментировать
  • Что не так в коде?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Шарп конечно позволяет уникод, но у меня глаза вытекли. Что он делать то должен?
    Ответ написан
    4 комментария
  • Unity(C#) - Как в Update выполнить 1 раз Invoke?

    MrMureno
    @MrMureno Куратор тега Unity
    VR for all
    самое очевидное..что вам не в апдейте надо это делать..а по событию какому то.
    а так если уж надо, то обычно просто флаг булевый ставят, что действие уже выполнено
    void Update()
    {
     if(!once)
     {
     once = true;
     //invoke here
     }
    }
    Ответ написан
    Комментировать
  • Надо сравнить массив с переменной и вернуть true или false?

    Morpheus_God
    @Morpheus_God
    Заведите отдельную перменную под ввод юзера, потом в цикле сравниваете то, что ввел юзер с содержимым массива.
    Можно даже в функцию обернуть. Которая будет принимать строку и к примеру нужный массив. И возвращать вам true или false.
    Как вариант

    static void Main(string[] args)
            {
                string[] items = { "Коробка", "Бутылка", "Телефон" };
    
                Console.WriteLine("Введите слово:");
                string user_input = Console.ReadLine();
    
    
                Console.WriteLine(isExist(user_input, items));
    
                Console.ReadKey();
            }
    
    
            static bool isExist(string user_input, string [] arr)
            {
                foreach(var word in arr)
                {
                    if (word == user_input)
                        return true;
                }
    
                return false;
            }

    Ответ написан
    2 комментария