Передача данных между двумя открытыми windows - PullRequest
0 голосов
/ 09 апреля 2020

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

Я хочу, чтобы он выглядел так: когда вы нажимаете кнопку (...), открывается окно «Выбор категории»

enter image description here

В окне «Выберите категорию» есть несколько кнопок. Когда вы нажимаете на одну из них, она подсвечивается, и строка под названием «категория» получает значение имени кнопки (кнопка, которую мы нажали). Я хочу отправить эту строку в первое окно и отобразить ее в текстовом поле «Категория» (когда мы нажимаем кнопку «выбрать».

enter image description here

Может кто-нибудь мне помочь? Как я могу отправить эту строку в первое окно? Это может быть очень легко, но у меня есть некоторые проблемы, и я не могу найти решение.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

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

Это действительно простой пример того, как вы можете передавать данные между windows: это просто свойство c publi с приватным установщиком. После того, как пользователь нажимает кнопку, чтобы выбрать категорию, свойство устанавливается и окно закрывается.

private void BtnCategory_Click(object sender, RoutedEventArgs e)
{
            CategoryWindow categoryWindow = new CategoryWindow();
            categoryWindow.ShowDialog();

            if(string.IsNullOrEmpty(categoryWindow.CategoryTitle))
            {
                // category is empty or not set
            }
            else
            {
                // category is set and not empty
            }
}

public partial class CategoryWindow : Window
{

        public string CategoryTitle { get; private set; }

        public CategoryWindow()
        {
            InitializeComponent();
        }

        private void BtnChoose_Click(object sender, RoutedEventArgs e)
        {
            CategoryTitle = GetSelectedCategory();

            this.Close();
        }

        private string GetSelectedCategory()
        {
            return string.Empty; // Return the selected Category here... string.Empty is just a placeholder!
        }
    }

Если оба windows должны оставаться открытыми, возможно, события являются правильной вещью для вас. Событие запускается, когда пользователь выбирает категорию. Другие windows могут подписаться на эти события, чтобы получать информацию.

private void BtnCategory_Click(object sender, RoutedEventArgs e)
        {
            CategoryWindow categoryWindow = new CategoryWindow();
            categoryWindow.OnCategoryChanged += CategoryChanged;

            categoryWindow.Show();
        }
        private void CategoryChanged(object sender, CategoryChangedEventArgs e)
        {
            if (string.IsNullOrEmpty(e.Category))
            {
                // category is empty or not set
            }
            else
            {
                // category is set and not empty
            }
        }


public partial class CategoryWindow : Window
    {
        public EventHandler<CategoryChangedEventArgs> OnCategoryChanged;

        public CategoryWindow()
        {
            InitializeComponent();
        }

        private void BtnChoose_Click(object sender, RoutedEventArgs e)
        {
            var selectedCategory = GetSelectedCategory();
            OnCategoryChanged?.Invoke(this, new CategoryChangedEventArgs(selectedCategory));
        }

        private string GetSelectedCategory()
        {
            return string.Empty; // Return the selected Category here... string.Empty is just a placeholder!
        }
    }

    public class CategoryChangedEventArgs : EventArgs
    {
        public string Category { get; private set; }

        public CategoryChangedEventArgs(string category)
        {
            Category = category;
        }
    }

0 голосов
/ 09 апреля 2020

Я не знаю, используете ли вы шаблон MVVM или нет, но в любом случае вы можете использовать библиотеку «Сообщения»:

Пример: MVVM Light Messenger Вы можете найти подробности здесь MVVM Light Messenger

Основное использование c будет

public class ViewModelA : ViewModelBase
{
    public void SearchCommandMethod()
    {
        MessengerInstance.Send<NotificationMessage>(new NotificationMessage("notification message"));
    }
}

public class ViewModelB : ViewModelBase
{
    public EmployeeListViewModel()
    {
        MessengerInstance.Register<NotificationMessage>(this, NotifyMe);
    }

    public void NotifyMe(NotificationMessage notificationMessage)
    {
        string notification = notificationMessage.Notification;
        //do your work
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...