繁体   English   中英

在两个打开的 windows 之间传递数据

[英]Passing data between two opened windows

我正在做自己的项目经理,并考虑了一些额外的选择。 我坚持项目类别(当你创建项目时,你必须选择它)

我希望它看起来像这样:当您单击 (...) 按钮时,“选择一个类别”window 打开

在此处输入图像描述

在“选择一个类别”window 中有一些按钮。 当您单击其中一个时,它会突出显示,并且名为“类别”的字符串会获取按钮名称(我们单击的按钮)的值。 我想将该字符串发送到第一个 window 并将其显示在类别文本框中(当我们单击“选择”按钮时。

在此处输入图像描述

有人能帮我吗? 如何将该字符串发送到第一个 window? 这可能很容易,但我遇到了一些麻烦,我找不到解决方案。

我不知道您是否使用 MVVM 模式,但无论如何您都可以使用“消息传递”库:

示例: MVVM Light Messenger您可以在此处找到详细信息MVVM Light Messenger

基本用法是

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
    }
}

请记住,这只是一个基本示例。 检查用户选择与否的数据总是好的。 这不是您问题的唯一解决方案。 在我看来,更重要的是了解底层系统以及在 windows 之间传输数据的意义,然后再从此处复制解决方案。

这是一个非常简单的示例,如何在 windows 之间传递数据:它只是一个带有私有 setter 的公共属性。 用户单击按钮选择类别后,属性被设置,window 被关闭。

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;
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM