从wpf中的用户控件获取数据到用户控件?

时间:2015-03-21 04:07:02

标签: wpf mvvm

基本上我是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的代码。现在请告诉我这个

中的错误

3 个答案:

答案 0 :(得分:0)

您需要使用数据绑定。

上次(也是唯一一次)我这样做了,当控制A事件触发时,我在xaml的代码中更新了一个属性;然后,在属性更改事件处理程序上,更新绑定到B的属性,B将自动更新。

再看看MSDN上的数据绑定。

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

无论您找到的最终解决方案是什么样的,我都会花费大量资金来处理数据绑定和一个或多个事件处理程序。

答案 1 :(得分:0)

你可以通过两种方式做到这一点。

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

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

  3. 通过委托和将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();    
    }
}

它会完美的工作!!!