使用 C# 在 WPF 类之间传递数据

问题描述 投票:0回答:1

我正在使用 C# 开发一个 WPF 项目,我需要在不同的类之间传递数据(特别是 ID)。我的设置涉及一个主窗口、一个患者模板(一个资源字典)和一个详细窗口。数据流应从MainWindow 到PatientTemplate,然后到DetailedWindow。我目前面临着数据传递的挑战,尤其是在 MainWindow 和 PatientTemplate 之间。

这是我想要实现的目标的简化版本:

在 MainWindow 中,我在名为 mqttMessageQueueArray 的数组中收到一个唯一 ID,该 ID 存储在 mqttMessageQueueArray[0] 中。我需要将此 ID 传递给 PatientTemplate。

PatientTemplate 然后会使用这个 ID 来执行一些操作,并最终将其传递给DetailedWindow。

最初,我尝试使用 MainWindow 中 ContentControl 的 Tag 属性来传递 ID,如下所示:

ContentControl PatientTemplateContentAddition = new ContentControl
{
    ContentTemplate = (DataTemplate)Resources["PatientTemplate"],
    Content = PatientenInstanz,
    Margin = new Thickness(5),
    Tag = mqttMessageQueueArray[0]
};

然后尝试访问 PatientTemplate 内部的标签并将其从那里发送到DetailedWindow,但我无法访问 PatientTemplate 中的标签值。它说标签值为空。

private void PatientZoomButton_Click(object sender, RoutedEventArgs e)
        {
            var control = sender as FrameworkElement;
            if (WindowCounter.OpenWindows < 1)
            {
                if (control is FrameworkElement element && element.Tag != null)
                {
                    DetailedWindowConstructor(element.Tag);
                }

                detailedWindow.Show();
                WindowCounter.OpenWindows++;
                detailedWindow.Closed += (s, args) => WindowCounter.OpenWindows--;
            }
        }

我试图实现这一目标,因为对于每个患者,我想将他们的阈值存储在详细信息窗口中,然后将它们与主窗口中 MQTT 发送的当前重要数据进行比较。

我的情况总结: 我有一个主窗口,我可以在其中接收可能来自多个患者及其 ID 的数据。我有一个显示的每个患者的 Patienttemplate 实例,每个患者都有一个详细的窗口,我想在其中存储我在运行时配置的阈值。我想访问 mainWindow 中的阈值,但要做到这一点,我需要准确访问属于正确患者的DetailedWindow 实例,或者将ID 提供给PatientTemplate,然后从那里到DetailedWindow,然后将其保存在阈值中value class 并将 Threshold 的实例与 ID 和所属实例一起保存在字典中。之后,我将通过字典访问所有阈值实例,并使用 ID 搜索正确的实例,然后将当前的 mqtt 消息与其阈值进行比较。

我目前的尝试是:

  1. 使用detailedWindow中的“get”方法(在具有阈值类之前)访问主窗口中阈值的设置值,然后通过ID将它们与等效的mqtt消息进行比较,但问题是为了访问“get”方法从详细窗口中,我需要在 mainWindow 中创建它的实例,但该实例与在 PatientTemplate 中创建的实例不同,所以我只得到“0”作为值。

  2. 我有一个阈值类文件,然后当我在详细窗口中的 UI 中按“保存”时,阈值将保存在阈值类中。之后,我可以访问 mainWindow 中阈值类中保存的值,并将它们与当前 MQTT 消息进行比较,但为了做到这一点,我还需要将 ID 保存在阈值类中,否则我不知道我正在访问哪个阈值现在。

因此,我需要一个解决方案来了解我当前正在访问哪个实例,以了解我当前正在查看哪些阈值,或者将 ID 从 mainWindow 发送到 PatientTemplate,然后发送到DetailedWindow,然后发送到 Threshold 并将其保存在那里。

c# wpf instance
1个回答
0
投票

我建议您考虑 MVVM 模式并以此模式实现您的应用程序。

WPF 建立在数据源视图的概念之上。因此,在 UI 元素之间传输数据的任务是非典型的,并且总是会导致一些问题。即使你在一个地方解决了,那么在另一个地方仍然会出现类似的问题。

如果您正确实现数据源(ViewModel),那么您的所有数据都将存储在一个位置,并且 UI 元素只需解决一个简单的任务:使用来自数据源的绑定接收数据。这是 WPF 的典型任务,可以使用 XAML 完全解决。通常甚至根本不使用夏普。

© www.soinside.com 2019 - 2024. All rights reserved.