在主窗口内的两个用户控件之间传输数据

时间:2014-06-26 20:54:15

标签: c# wpf xaml

目标:
位于文本框内部的输入数据(usercontrol_menu.xaml)将被传输,然后被使用并显示在usercontrol_number1.xaml内的标签中。当您按下“enter”按钮或单击usercontrol_menu.xaml内的“Send”按钮时,将执行输入数据的传输。

问题:
为了实现目标,您是否在我的源代码中结合了一个具体示例?

信息:
- MainWindows.xaml位于一个独立的项目中。

enter image description here

enter image description here

XAML

-- MainWindow.xaml

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:usercontrol_menu="clr-namespace:usercontrol_menu;assembly=usercontrol_menu" xmlns:usercontrol_number1="clr-namespace:usercontrol_number1;assembly=usercontrol_number1" x:Class="MainWindows.MainWindow"
        Title="MainWindow" Height="350" Width="525">
    <Grid>

        <usercontrol_menu:UserControl1 HorizontalAlignment="Left" VerticalAlignment="Top" Height="124" Width="434" Margin="24,28,0,0"/>
        <usercontrol_number1:UserControl1 HorizontalAlignment="Left" Margin="24,176,0,0" VerticalAlignment="Top" Height="115" Width="434"/>

    </Grid>
</Window>



-- usercontrol_menu         UserControl1.xaml

<UserControl x:Class="usercontrol_menu.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid Background="#FFF3CBCB">
        <Button x:Name="btn_send" Content="Send" HorizontalAlignment="Left" Margin="99,100,0,0" VerticalAlignment="Top" Width="75"/>
        <TextBox x:Name="txt_input" HorizontalAlignment="Left" Height="23" Margin="54,57,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120"/>
    </Grid>
</UserControl>



-- usercontrol_number1         UserControl1.xaml

<UserControl x:Class="usercontrol_number1.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid Background="#FFFF9D9D">
        <Label x:Name="lbl_text" Content="Text" HorizontalAlignment="Left" Margin="31,44,0,0" VerticalAlignment="Top"/>
    </Grid>
</UserControl>

下面的C#代码:

  namespace MainWindows
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void test()
        {
            usercontrol_menu.UserControl1 aaa = new usercontrol_menu.UserControl1();
            usercontrol_number1.UserControl1 bbb = new usercontrol_number1.UserControl1();

            aaa.OnParameterChange += bbb.OnUserControl1ParameterChange;  


        }



    }
}

----------------

namespace usercontrol_menu
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class UserControl1 : UserControl
    {

        public UserControl1()
        {
            InitializeComponent();
        }

        public delegate void ParameterChange(string Parameter);
        public ParameterChange OnParameterChange { get; set; }


        private void btn_send_Click(object sender, RoutedEventArgs e)
        {
            ParameterChange myParameterChange = new ParameterChange(OnParameterChange);

            OnParameterChange("test");
        }



    }


}

-----------------

namespace usercontrol_number1
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        public void OnUserControl1ParameterChange(string pData)
        {
            lbl_text.Content = pData;
        }
    }
}

3 个答案:

答案 0 :(得分:0)

由于您的问题与How to call functions in a main view model from other view models?问题不完全相同,因此我没有将其作为副本关闭。但是,我相信您的问题的答案在于我对链接问题的回答以及它与之关联的问题,即使用delegates

这些问题的不同之处在于他们使用的是视图模型,而您似乎正在使用代码。无论哪种方式,它都没什么区别,因为只要你有一个共同的父母,你就可以在代码中使用delegateMainWindow.xaml.cs可能是您的共同父母。


更新&gt;&gt;&gt;

  

您提供的链接不符合我的目的。在我的例子中,它位于mainwindows.xaml

内部的两个用户控件之间

这正是我所提到的。在delegate文件中定义usercontrol_menu.xaml.cs,在usercontrol_number1.xaml.cs文件中定义处理程序,并将其连接到MainWindow.xaml.cs。从另一个链接问题(Passing parameters between viewmodels)扩展我的示例,您可以执行以下操作:

MainWindow.xaml.cs

usercontrol_menu.ParameterChange += usercontrol_number1.OnUserControl1ParameterChange;

再次阅读链接的答案以及MSDN上的链接页面,您就可以获得它。

答案 1 :(得分:0)

使用Prism的EventAggregator。 给出了一个很好的解释here。只需下载示例并运行即可。这正是你所期待的。

答案 2 :(得分:0)

1.下载并安装所有usercontrol的软件包。 https://www.nuget.org/packages/MvvmLight/

2.定义一个可供所有usercontrol访问的消息类。它在解决方案中的位置并不重要

public class MyMessage
{
   public string Text { get; set; }
}

3.在usercontrol_menu中,创建此类的实例并将其传递给用户控件中Messenger的Send方法。:

using GalaSoft.MvvmLight.Messaging;
...
private void btn_send_Click(object sender, RoutedEventArgs e)
{
    var msg = new MyMessage2() { Text = txt_input.Text };
    Messenger.Default.Send<MyMessage2>(msg);
}

4.在usercontrol_number1的构造函数中注册给定的消息类型:

Messenger.Default.Register<MyMessage>
( 
     this, 
     ( action ) => { lbl_text.Content = action.Text; }
);

要使用Messenger,您需要在每个项目中引用它,并在每个类中使用“。”

信使的工作方式是发布者/发件人创建特定类型的消息(如该类中的消息)。接收者订阅该类型的消息。所以Type(对象)定义了消息是什么。当然也可以包含数据。