gpt4 book ai didi

c# - 用户控件之间的 WPF 通信

转载 作者:行者123 更新时间:2023-11-30 14:31:37 26 4
gpt4 key购买 nike

我正试图找到在两个用户控件之间进行通信的最佳方式。我有一个主 XAML 窗口,其中包含两个用户控件,这两个用户控件又包含各种控件。每个用户控件的代码隐藏只是将 DataContext 设置为与其关联的 View 模型。 View 模型包含绑定(bind)到控件的对象。我想要做的是在用户控件 1 中的列表框更改选择时捕获,新选定的项目将显示在用户控件 2 的编辑框中。因为我正在使用 View 模型,所以我无法声明依赖属性我想知道执行此操作的公认方法是什么?我附上了一些基本代码来展示我是如何设置控件的。

主窗口 XAML

<Window x:Class="CommsTest.View.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CommsTest.View"
Title="MainWindow" Height="350" Width="525">
<Grid>
<local:UserControl1 />
<local:UserControl2 />
</Grid>

UserControl1 XAML

<UserControl x:Class="CommsTest.View.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>
<ComboBox Height="23" HorizontalAlignment="Left" Margin="50,110,0,0" Name="comboBox1" VerticalAlignment="Top" Width="199" ItemsSource="{Binding Combo1}" />
</Grid>

UserControl1ViewModel.cs

class UserControl1ViewModel
{
private ObservableCollection<string> combo1 = new ObservableCollection<string>();

public ObservableCollection<string> Combo1
{
get { return combo1; }
}
}

UserControl2.XAML

<UserControl x:Class="CommsTest.View.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:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBox Height="23" HorizontalAlignment="Left" Margin="63,84,0,0" Name="textBox1" VerticalAlignment="Top" Width="170" Text="{Binding Path=Text1}" />
</Grid>

UserControl2ViewModel.cs

class UserControl2ViewModel
{
private string text1;

public string Text1
{
get { return text1; }
set { text1 = value; }
}
}

如何让 UserControl2.Text1 成为 UserControl2.Combo1 的选定值?谢谢

最佳答案

虽然我知道您问的是如何在 UserControl 之间进行通信,但我建议答案是在 View 模型之间进行通信>。这可以使用 delegate 对象轻松实现。通常,您需要有一个对两个 subview 模型通用的父 View 模型。

我最近回答了一个类似的问题,所以我不会重复回答。相反,我会请您看一下 Passing parameters between viewmodels 中的答案。在 StackOverflow 上发布,其中使用代码示例解释了解决方案。


更新>>>

当我说您的 subview 模型需要一个共同的父级时,我的意思与继承无关。我的意思是父级持有每个 subview 模型的变量实例……父级实例化 subview 模型。

无需在后面的 View 代码中创建 View 模型实例,您可以在父 View 模型中执行此操作并将 View 模型连接到 View ,如下所示:

资源中:

<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
<Views:MainView />
</DataTemplate>
...
<DataTemplate DataType="{x:Type ViewModels:UsersViewModel}">
<Views:UsersView />
</DataTemplate>

然后您只需要显示 View 模型的一个实例,相应的 View 就会显示出来:

ParentView中:

<ContentControl Content="{Binding ViewModel}" />

ParentViewModel 中:

public BaseViewModel ViewModel { get; set; } // Implement INotifyPropertyChanged

然后当你想显示一个新 View 时:

ViewModel = new UsersViewModel();

如果您的 subview 没有 BaseViewModel 和/或不可互换,那么您可以为每个 subview 添加一个属性:

public MainViewmodel MainViewModel { get; set; } // Implement INotifyPropertyChanged
public UsersViewmodel UsersViewModel { get; set; } // properly for these properties

无论哪种方式,如果您要能够使用处理程序“将它们连接在一起”,则需要从父 View 访问这些 View 模型。

关于c# - 用户控件之间的 WPF 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19686382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com