在不使用MVVM的情况下WPF中两个用户控件之间的交互

本文关键字:两个 用户 交互 之间 控件 MVVM 情况下 WPF | 更新日期: 2023-09-27 18:15:33

我的应用程序中有两个UserControls,它们都驻留在MainWindow上。现在我需要在这两者之间进行交互,当我点击UserControl1中的Button时,UserControl2中的TextBlockText属性会发生变化。

如果没有MVVM,我怎么能做到这一点?我很想看看MVVM解决方案,虽然如果它是完整的,因为我完全是新的,它是非常压倒性的。

主窗口:

<Window x:Class="WpfApplication23.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        xmlns:wpfApplication23="clr-namespace:WpfApplication23">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <wpfApplication23:UserControl1/>
        <wpfApplication23:UserControl2 Grid.Row="1"/>
    </Grid>
</Window> 

UserControl1:

<UserControl x:Class="WpfApplication23.UserControl1"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <Grid>
        <Button Content="Change Text"
                Width="200"
                Height="80"
                Click="ButtonBase_OnClick"/>
    </Grid>
</UserControl>

UserControl2:

<UserControl x:Class="WpfApplication23.UserControl2"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <TextBox Width="100" Height="20"/>
    </Grid>
</UserControl>

点击事件按钮:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
   // Access the TextBlock in UserControl2 and Change its Text to "Hello World"
}

在不使用MVVM的情况下WPF中两个用户控件之间的交互

要在不使用 MVVM的情况下使用,您需要执行以下操作:

  1. 在第一个用户控件上设置一个类似"UpdateText"的事件,让按钮的click方法引发此事件

    public event Action<string> UpdateText;
    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
       // Access the TextBlock in UserControl2 and Change its Text to "Hello World"
       if (UpdateText != null)
           UpdateText("HelloWorld");
    }
    
  2. 监听MainWindow中的事件,然后调用第二个用户控件上的函数来更新文本块。比如:

    public MainWindow()
    {
        InitializeComponent();
        myUserControl1.UpdateText += HandleUpdateText;
    }
    private void HandleUpdateText(String newText)
    {
        myUserControl2.SetText(newText);
    }
    

现在的答案是使用MVVM,但是所需的代码样本对于StackOverflow来说太长了。我将提供这些步骤:

  1. 在第二个用户控件的"Text"属性上设置一个DependencyProperty,并绑定到它:

    <UserControl x:Class="WpfApplication23.UserControl2"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <Grid>
           <TextBox Width="100" Height="20" Text="{Binding ControlText}"/>
        </Grid>
    </UserControl>
    
  2. ICommand依赖属性放在将在按钮单击时调用的第一个用户控件上。在MainWindow上绑定一个函数,将ControlText属性设置为参数对象。

可能不是最好的"第一个MVVM"示例,因为它需要一些高级概念(命令和依赖属性),但它不应该太难实现