从 wpf 中的用户控件获取数据到用户控件?
Get data from a user control in wpf to an user control?
基本上我是 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的代码。现在请让我知道这里的错误
您需要使用数据绑定。
我上次(也是唯一一次)这样做,当控件 A 事件触发时,我从 xaml 后面的代码中更新了一个 属性;然后,在 属性 changed 事件处理程序上,更新绑定到 B 的 属性,B 将自动更新。
去看看MSDN上的数据绑定就知道了。
编辑:以防万一我不清楚,在我的例子中我有一些逻辑要实现。如果您的情况是您实际上只是想在另一个控件上复制文本,那么您可以将文本字段直接绑定到同一个 属性,它们会一起更新。
无论您找到的最终解决方案是什么样子,我敢打赌它会涉及数据绑定和一个或多个事件处理程序。
您可以通过两种方式完成这些操作。
通过 Ron Thompson 所说的数据绑定。
另一种方法是使用委托和事件
通过委托将值从 UserControl1 传递到 ParentControl
事件,然后从父控件获取值到 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();
}
}
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();
}
}
它将完美运行!!!
基本上我是 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的代码。现在请让我知道这里的错误
您需要使用数据绑定。
我上次(也是唯一一次)这样做,当控件 A 事件触发时,我从 xaml 后面的代码中更新了一个 属性;然后,在 属性 changed 事件处理程序上,更新绑定到 B 的 属性,B 将自动更新。
去看看MSDN上的数据绑定就知道了。
编辑:以防万一我不清楚,在我的例子中我有一些逻辑要实现。如果您的情况是您实际上只是想在另一个控件上复制文本,那么您可以将文本字段直接绑定到同一个 属性,它们会一起更新。
无论您找到的最终解决方案是什么样子,我敢打赌它会涉及数据绑定和一个或多个事件处理程序。
您可以通过两种方式完成这些操作。
通过 Ron Thompson 所说的数据绑定。
另一种方法是使用委托和事件
通过委托将值从 UserControl1 传递到 ParentControl 事件,然后从父控件获取值到 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();
}
}
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();
}
}
它将完美运行!!!