【发布时间】: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 提出的两种方法,看看哪一种最适合我。感谢您的意见!