在不使用MVVM的情况下WPF中两个用户控件之间的交互
本文关键字:两个 用户 交互 之间 控件 MVVM 情况下 WPF | 更新日期: 2023-09-27 18:15:33
我的应用程序中有两个UserControls
,它们都驻留在MainWindow
上。现在我需要在这两者之间进行交互,当我点击UserControl1
中的Button
时,UserControl2
中的TextBlock
的Text
属性会发生变化。
如果没有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的情况下使用,您需要执行以下操作:
-
在第一个用户控件上设置一个类似"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"); }
-
监听
MainWindow
中的事件,然后调用第二个用户控件上的函数来更新文本块。比如:public MainWindow() { InitializeComponent(); myUserControl1.UpdateText += HandleUpdateText; } private void HandleUpdateText(String newText) { myUserControl2.SetText(newText); }
现在右的答案是使用MVVM,但是所需的代码样本对于StackOverflow来说太长了。我将提供这些步骤:
-
在第二个用户控件的"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>
-
将
ICommand
依赖属性放在将在按钮单击时调用的第一个用户控件上。在MainWindow
上绑定一个函数,将ControlText
属性设置为参数对象。
可能不是最好的"第一个MVVM"示例,因为它需要一些高级概念(命令和依赖属性),但它不应该太难实现