从子UserControl WPF更改父UserControl中的文本

时间:2018-10-16 16:50:42

标签: c# wpf

如果ParentUserControl包含TextBlockParentUserControl还包含具有ChildUserControl的{​​{1}}。我想从TextBox设置TextBlock的{​​{1}}。我该怎么办?
换句话说,以某种方式访问​​ParentUserControl和它的ChildTextBox元素,然后从ParentUserControl修改它的值!

更新
我有一个包含TextBlock的{​​{1}}的xaml窗口。现在,我正在运行时加载或添加另一个ChildUserControl到其中。这个新添加的ParentUserControl包含一个TextBlock。现在,我希望当我在此ChildUserControl中输入一些值时,ChildUserControl的{​​{1}}应该获得该值并自我更新。

1 个答案:

答案 0 :(得分:0)

假设我们没有遵循任何MVVM,并且解决此问题的简单方法是

  1. 使用下面的文本框创建一个ChildUserControl,

          <UserControl x:Class="SO52840402.ChildUserControl"
          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" 
          xmlns:local="clr-namespace:SO52607887"
          mc:Ignorable="d" 
          d:DesignHeight="450" d:DesignWidth="800">
      <Grid>
       <TextBox x:Name="ChildTextBox" />
      </Grid>  </UserControl>
    
  2. 创建一个包含TextBlock和ChildUserControl实例的ParentUserControl,如下所示,

           <UserControl x:Class="SO52840402.ParentUserControl"
           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" 
          xmlns:local="clr-namespace:SO52607887"
          mc:Ignorable="d" 
          d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
      <Grid.RowDefinitions>
          <RowDefinition />
          <RowDefinition />
      </Grid.RowDefinitions>
    
      <TextBlock x:Name="ParentTextBlock" Text="Hallo World!"/>
    
      <local:ChildUserControl x:Name="ChildUserControl" Grid.Row="1" />
    
    </Grid>  </UserControl>
    
  3. 现在在“ InitializeComponent”之后从ParentUserControl构造函数后面的代码为ChildUserControl下的TextBox创建一个TextChanged事件,如下所示,

    public ParentUserControl()
    {
        InitializeComponent();
        ChildUserControl.ChildTextBox.TextChanged += OnChildTextBox_TextChanged;
    }
    
    private void OnChildTextBox_TextChanged(object sender, EventArgs e)
    {
        ParentTextBlock.Text = (sender as TextBox).Text;
    }
    

注意:-这不是推荐的方法。为获得最佳方法,请遵循MVVM模式并了解您的要求并进行设计。由于您需要从子用户控件到父用户控件的某些东西,因此最好的方法是将ViewModel绑定到父子控件,并在父viewmodel中访问子视图模型并执行“所需的操作”。