首页 > 解决方案 > 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在考试虚拟机中实现,就应该通知模板选项卡中的绑定。

我怎样才能使这项工作?对我完全(或大部分)错误的可能性持开放态度。

标签: c#wpf

解决方案


推荐阅读