![](/img/trans.png)
[英]Share DataContext between MainWindows and UserControl
[英]Transfer data Between two Usercontrol inside of Mainwindows
目標:
位於文本框(usercontrol_menu.xaml)內的輸入數據應進行傳輸,然后使用並顯示在usercontrol_number1.xaml內的標簽中。 當您按下usercontrol_menu.xaml中的“輸入”按鈕或單擊“發送”按鈕時,將執行輸入數據的傳輸。
問題:
為了實現目標,您是否在我的源代碼上結合了具體示例?
信息:
-MainWindows.xaml位於單獨的項目中。
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;
}
}
}
因為您的問題與其他視圖模型中的“ 如何在主視圖模型中調用函數”不完全一樣? 問題,我沒有將其作為重復項關閉。 但是,我相信您對這個問題的答案就在於我對鏈接問題的回答,以及它所鏈接的問題,即使用delegate
s 。
這些問題的不同之處在於,它們使用的是視圖模型,而似乎您將在后面使用代碼。 無論哪種方式,它都沒有什么區別,因為只要您有一個公共的父代,就可以在代碼中以相同的方式使用delegate
。 MainWindow.xaml.cs
可能是您的共同父母。
更新>>>
您提供的鏈接不符合我的目的。 就我而言,它位於mainwindows.xaml內部的兩個用戶控件之間
這正是我提到的。 定義你的delegate
在usercontrol_menu.xaml.cs
文件和處理程序usercontrol_number1.xaml.cs
文件,並將它們連接在MainWindow.xaml.cs
。 從另一個鏈接的問題( 在viewmodels之間傳遞參數 )擴展我的示例,您可以執行以下操作:
在MainWindow.xaml.cs
:
usercontrol_menu.ParameterChange += usercontrol_number1.OnUserControl1ParameterChange;
再次閱讀鏈接的答案和MSDN上的鏈接頁面,您將獲得它。
使用棱鏡的EventAggregator。 這里給出一個很好的解釋。 只需下載示例並運行。 正是您所期望的。
1.下載並安裝所有用戶控件的軟件包。 https://www.nuget.org/packages/MvvmLight/
2.定義所有用戶控件都可以訪問的消息類。 它將位於解決方案內部的位置無關緊要
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,您需要在每個項目中都有一個對它的引用,並在每個類中需要一個Using。
Messenger的工作方式是發布者/發送者創建特定類型的消息(如該類中的)。 接收者訂閱該類型的消息。 因此,(對象的)類型定義了消息是什么。 並且當然也可以包含數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.