【问题标题】:Updating textbox from different classes in the application从应用程序中的不同类更新文本框
【发布时间】:2017-04-20 00:38:32
【问题描述】:

我在这里阅读了许多类似的帖子,但我仍然有一些问题,不仅涉及如何完成此任务,还有是否有更好或更合适的方法来完成此任务。这是因为我有一个 WPF 应用程序,其中有一个主窗口,它实例化一个名为 ScratchPad 的页面对象,该对象包含一个文本框和一个更新该文本框内容的方法。

public partial class MainWindow
{ 
    public MainWindow()
    {
        InitializeComponent();
        ScratchPad scratchPad = new ScratchPad();
    }
}

这是关联的 XAML,它还在 MainWindow 的框架中实例化(?)我的其他应用程序。

 <DockPanel>
    <TabControl TabStripPlacement="Left">
        <TabItem Header="Main">
            <Frame Source="Common/GUI/ScratchPad.xaml" ></Frame>
        </TabItem>
        <TabItem Header="Test Apps">
            <Frame Source="Apps/TestApp/View/authPrompt_View.xaml" Margin="0,0,0,191.2" />
        </TabItem>
        <TabItem Header="Threads">

        </TabItem>
    </TabControl>
</DockPanel>

此对象旨在显示日志材料以报告应用程序执行的操作状态。 ScratchPad 的代码如下。

public partial class ScratchPad : Page
{
    public ScratchPad()
    {
        InitializeComponent();
    }

    public void updateStatus(string newText)
    {
        scratchPadTextBox.AppendText(newText);
    }
}

我的目的是让我的许多其他类能够附加到该文本框,但是我相信为了做到这一点,我需要将对 MainWindow 对象的引用传递给每个想要写入的类那个文本框。我的问题是其他类没有直接实例化(据我所知),因此我不太确定如何完成这一点,或者即使这是应该如何完成的。这是我希望能够附加到文本框的类示例,当用户在通过 MainWindow 的 XAML 中的框架源实例化(?)的页面上点击提交时创建的文本框。

    class ConnectionManager
    {
    public void authenticateSharePoint(string urlAddress)
    {
        DataContextRef.DataContextRefDataContext dc =
            new DataContextRef.DataContextRefDataContext(new Uri("redacted.svc"));

        dc.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; var source = dc.Test;
        ((System.Net.NetworkCredential)dc.Credentials).Domain = "blah";
        ((System.Net.NetworkCredential)dc.Credentials).UserName = "blah";
        ((System.Net.NetworkCredential)dc.Credentials).Password = "hardcodeisthebest123";
        foreach (var item in source)
        {
            scratchPad.updateStatus("item.name: " + item.Name);
            updateStatus("item.title: " + item.Title);
            updateStatus("item.path: " + item.Path);
            updateStatus("item.id: " + item.Id);
        }
    }

正如上面再次复制的 XAML 中所见,当用户在 MainWindow 的框架中托管的单独类中选择提交按钮时,将创建此类

    <TabItem Header="Test App">
        <Frame Source="Apps/TestApp/View/authPrompt_View.xaml" Margin="0,0,0,191.2" />
    </TabItem>

与往常一样,当我输入我的问题时,我意识到从知识差距的角度来看我需要解决多少领域。感谢您提供任何见解和/或帮助!

【问题讨论】:

  • 理论上,1.使用Event将消息从一个视图发送到另一个视图。或者 2. 简单地引用/同步属性来观察第二个视图的 ViewModel 的属性。
  • 你可以做类似的事情。stackoverflow.com/questions/43482545/… 你的 TPayload 可以是 并且 textBox 可以订阅多个发布者,来自其他 childViews
  • 如前所述,您的问题过于宽泛。但是,您应该首先开始停止直接操作scratchPadTextBox 元素。你的代码应该有一个视图模型,有一个 string 属性代表要显示的文本,绑定到文本框的 Text 属性,并且对文本的任何更改都应该通过视图模型进行,而不是直接通过文本框.文本框甚至不需要名称。然后如何最好地将该视图模型属性公开给其他类型是值得商榷的,特别是考虑到上述缺乏上下文。但这是一个简单得多的问题。
  • 谢谢大家!我相信 Peter 是正确的,因为我应该使用视图模型类来操作视图,这是我其余代码中的范例。完成后,我将研究 Kurakura88 和 Ivica 提出的两种方法,看看哪一种最适合我。感谢您的意见!

标签: c# wpf xaml


【解决方案1】:

但是我相信为了做到这一点,我需要将对 MainWindow 对象的引用传递给每个想要写入该文本框的类。

您可以使用Application.Current.Windows 集合获取对MainWindow 现有实例的引用:

MainWindow mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
if(mainWindow != null)
{
    //...
}

【讨论】:

【解决方案2】:

为了能够访问主视图的对象,您必须从要访问它的类创建它的实例。

       ScratchPad name = new ScratchPad();

现在您应该可以使用以下内容访问便笺簿:

     name.updateStatus.scratchPadTextBox

【讨论】:

  • 我确实创建了它的一个实例,但我不想创建该对象的多个实例。一旦 MainWindow 类实例化对象,我希望其他类能够操作已经创建的对象。我相信上面的 Peter Duniho 提到了正确的方法,所以我会修复我当前的代码,然后看看我在哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多