c# - ViewModel 之间的值更新通知
问题描述
我有一个选项卡控件,带有一个“考试”选项卡和一个“模板”选项卡。我想在两个选项卡之间共享信息。
我的背景主要是使用 React 和 Redux 的 web,所以我的直觉是让共享信息(模型类型Exam
)属于 MainWindow,可能作为窗口资源。
我的技术负责人比我更有经验——在所有方面,而且在 C# 方面,尽管他也是 WPF 的新手),向我保证这不是在这种情况下这样做的方法,选项卡的 ViewModel 应该共享/传递信息。
因此,我在“考试”选项卡中设置了我的基本 UI,并在“模板”选项卡中使用了一个标签来显示文本框的内容。
<Page x:Class="Gui.Tabs.ExamsTab.ExamsHome" Title="ExamsTab">
<Grid VerticalAlignment="Center">
<StackPanel>
<Label Content="EXAMS TAB" />
<TextBox Text="{Binding ExamString, UpdateSourceTrigger=PropertyChanged}"/>
<Label Content="{Binding ExamString}" />
</StackPanel>
</Grid>
</Page>
--------
<Page x:Class="Gui.Tabs.TemplatesTab.TemplatesHome" Title="TemplatesHome">
<Grid VerticalAlignment="Center">
<StackPanel>
<Label Content="TEMPLATES TAB"/>
<Label Content="Text from Exams tab:"/>
<Label BorderBrush="Red" BorderThickness="1" Content="{Binding StringFromExamsTab}"/>
</StackPanel>
</Grid>
</Page>
我已经尽我所能连接了 ViewModels:(代码隐藏和 viewmodels 现在在同一个文件中)
namespace Gui.Tabs.ExamsTab {
public partial class ExamsHome : Page {
public ExamsHome() {
InitializeComponent();
DataContext = ViewModel;
}
public static readonly ExamsTabViewModel ViewModel = new ExamsTabViewModel();
}
public class ExamsTabViewModel :INotifyPropertyChanged {
private string _examString = "Default exam string";
public string ExamString {
get => _examString;
set {
_examString = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = "") {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
------
namespace Gui.Tabs.TemplatesTab {
public partial class TemplatesHome : Page {
public TemplatesHome() {
InitializeComponent();
DataContext = viewModel;
}
public static readonly TemplatesTabViewModel viewModel = new TemplatesTabViewModel();
}
public class TemplatesTabViewModel {
public string StringFromExamsTab {
// needs to be notified of value change!
get => ExamsHome.ViewModel.ExamString;
}
}
}
在“考试”选项卡中,文本框及其相应的标签已同步。而且,在模板选项卡中,红色框显示“默认考试字符串”,但它不会随着文本框中的值而改变。
我读过:
XAML 绑定引擎为实现 INotifyPropertyChanged 接口的类上的每个绑定属性侦听 [PropertyChangedEvent]
这对我来说意味着只要INotifyPropertyChanged
在考试虚拟机中实现,就应该通知模板选项卡中的绑定。
我怎样才能使这项工作?对我完全(或大部分)错误的可能性持开放态度。
解决方案
推荐阅读
- html - 如何使用 CSS 创建 3 段甜甜圈/环?
- java - Delete 和 DeleteById 方法在 Hibernate 中不起作用
- java - 错误:无法找到或加载主类 -Xms1G
- vba - vba scrape html - 获取具有动态类的元素
- user-interface - 在 Tkinter GUI 中嵌入散景和大数据
- javascript - 在 JavaScript 中使用 setInterval 循环时如何让精灵停止移动
- javascript - 选中复选框时,如何将表单控件的所有值传递给另一个表单?
- android-studio - 如何在 Google Play 音乐中添加浮动活动,例如“正在播放音乐”
- r - 为什么这段代码使用 == 和 | 运算符的结果为 TRUE
- php - 将 MySQL 表数据插入 PHP 数组