从 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上的数据绑定就知道了。

编辑:以防万一我不清楚,在我的例子中我有一些逻辑要实现。如果您的情况是您实际上只是想在另一个控件上复制文本,那么您可以将文本字段直接绑定到同一个 属性,它们会一起更新。

无论您找到的最终解决方案是什么样子,我敢打赌它会涉及数据绑定和一个或多个事件处理程序。

您可以通过两种方式完成这些操作。

  1. 通过 Ron Thompson 所说的数据绑定。

  2. 另一种方法是使用委托和事件

通过委托将值从 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();    
    }
}

它将完美运行!!!