基本上我是WPF的新手。我有一个用户控件 - A.在A里面,我有另一个用户控件B.当按下B上的按钮时,一个值将被传递给A.我正在尝试WPF MVVM。请帮助我。
//-------------------MainWindow------------------//
public partial class MainWindow : Window
{
public delegate void ValuePassDelegate(int ValueToGet);
public event ValuePassDelegate ValuePassEvent;
public UserControl1 UserControl1Obj = new UserControl1();
public UserControl2 UserControl2Obj = new UserControl2();
public MainWindow()
{
InitializeComponent();
ValuePassEvent += new ValuePassDelegate(method1);
UserControl1Obj.del = ValuePassEvent;
}
public void method1(int ValueToGet)
{
UserControl2Obj.txtName.Text = ValueToGet.ToString();
}
}
//---------------------UserControl1------------------//
public partial class UserControl1 : UserControl
{
public Delegate del;
public int ValueToPass = 0;
public UserControl1()
{
InitializeComponent();
}
public void method1()
{
del.DynamicInvoke(ValueToPass);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
method1();
}
}
//-----------------UserControl2--------------------//
public partial class UserControl2 : UserControl
{
public int ValueToGet;
public UserControl2()
{
InitializeComponent();
}
}
这些是UserControl1,UserControl2和mainwindow的代码。现在请告诉我这个
中的错误答案 0 :(得分:0)
您需要使用数据绑定。
上次(也是唯一一次)我这样做了,当控制A事件触发时,我在xaml的代码中更新了一个属性;然后,在属性更改事件处理程序上,更新绑定到B的属性,B将自动更新。
再看看MSDN上的数据绑定。
编辑:以防万一我不清楚,在我的情况下我有一些逻辑要实现。如果你的情况是你只想在另一个控件上复制文本,那么你可以直接将文本字段绑定到同一个属性,并且它们一起更新。
无论您找到的最终解决方案是什么样的,我都会花费大量资金来处理数据绑定和一个或多个事件处理程序。
答案 1 :(得分:0)
你可以通过两种方式做到这一点。
通过数据绑定,如Ron Thompson所说。
另一种方法是使用委托和事件
通过委托和将UserControl1中的值传递给ParentControl 事件然后从Parent Control获取值到UserControl2
示例代码:
public class UserControl1
{
public Delegate del;
public int ValueToPass = 0;
public UserControl1()
{
InitializeComponent();
}
public void method1()
{
del.DynamicInvoke(ValueToPass);
}
}
public class ParentControl
{
public delegate void ValuePassDelegate(int ValueToGet);
public event ValuePassDelegate ValuePassEvent;
public UserControl1 UserControl1Obj = new UserControl1();
public UserControl2 UserControl2Obj = new UserControl2();
public ParentControl()
{
InitializeComponent();
ValuePassEvent += new ValuePassDelegate(method1);
UserControl1Obj.del = ValuePassEvent;
}
public void method1(int ValueToGet)
{
UserControl2Obj.ValueToGet = ValueToGet;
}
}
public class UserControl2
{
public int ValueToGet;
public UserControl2()
{
InitializeComponent();
}
}
答案 2 :(得分:0)
<强> MainWindow.xaml 强>
<Window x:Class="TestMultipleUserControl.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:TestMultipleUserControl"
Title="MainWindow" Height="350" Width="525">
<Grid>
<controls:UserControl1 Name="UserControl1Obj" Margin="10,-5,38,148"/>
<controls:UserControl2 Name="UserControl2Obj" Margin="153,171,38,10"/>
</Grid>
</Window>
<强> MainWindow.xaml.cs 强>
public partial class MainWindow : Window
{
public delegate void ValuePassDelegate(int ValueToGet);
public event ValuePassDelegate ValuePassEvent;
public MainWindow()
{
InitializeComponent();
ValuePassEvent += new ValuePassDelegate(method1);
UserControl1Obj.del = ValuePassEvent;
}
public void method1(int ValueToGet)
{
UserControl2Obj.txtName.Text = ValueToGet.ToString();
}
}
<强> UserControl1.xaml 强>
<UserControl x:Class="TestMultipleUserControl.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>
<Button Content="Button" HorizontalAlignment="Left" Margin="77,121,0,0" VerticalAlignment="Top" Width="166" Height="44" Click="Button_Click"/>
</Grid>
</UserControl>
<强> UserControl1.xaml.cs 强>
public partial class UserControl1 : UserControl
{
public Delegate del;
public int ValueToPass = 0;
public UserControl1()
{
InitializeComponent();
}
public void method1()
{
del.DynamicInvoke(ValueToPass);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
method1();
}
}
<强> UserControl2.xaml 强>
<UserControl x:Class="TestMultipleUserControl.UserControl2"
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:DesignWidth="300" Height="174.286">
<Grid>
<TextBox x:Name="txtName" HorizontalAlignment="Left" Height="46" Margin="51,55,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="211"/>
</Grid>
</UserControl>
<强> UserControl2.xaml.cs 强>
public partial class UserControl2 : UserControl
{
public UserControl2()
{
InitializeComponent();
}
}
它会完美的工作!!!