Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF和VB.net:数据绑定到在Expression Blend外部创建的单独类_Wpf_Binding - Fatal编程技术网

WPF和VB.net:数据绑定到在Expression Blend外部创建的单独类

WPF和VB.net:数据绑定到在Expression Blend外部创建的单独类,wpf,binding,Wpf,Binding,我有一个WPF应用程序,它的表单有一个名为“txtStatusWindow”的文本框。我还有一个同事交给我的vb.net类,它需要由我的应用程序代码中的代码调用和执行。我的同事坚持认为我需要使用公共.net事件来更新表单上的文本框 单独的vb.net类: Public Class globalclass Public Event txtStatusWindow(ByVal Text As String) Public Sub InitializeProgram() RaiseEve

我有一个WPF应用程序,它的表单有一个名为“txtStatusWindow”的文本框。我还有一个同事交给我的vb.net类,它需要由我的应用程序代码中的代码调用和执行。我的同事坚持认为我需要使用公共.net事件来更新表单上的文本框

单独的vb.net类:

Public Class globalclass

Public Event txtStatusWindow(ByVal Text As String)


Public Sub InitializeProgram()
    RaiseEvent txtStatusWindow("Updating something.")
    System.Threading.Thread.Sleep(2000)
    RaiseEvent txtStatusWindow("Updating something else.")
    System.Threading.Thread.Sleep(2000)
    RaiseEvent txtStatusWindow("Updating something other than else.")
    System.Threading.Thread.Sleep(2000)
    RaiseEvent txtStatusWindow("Updating something other than the else stuff.")
    System.Threading.Thread.Sleep(2000)
End Sub

End Class
我需要能够从我的代码中调用子“InitializeProgram()”,并且它需要能够在运行时更新“txtStatusWindow.text”

我告诉他文本框的更新可以通过数据绑定来完成,但我不知道如何将这样一个单独的类集成到我的项目中,如何调用其中的方法,或者如何使它通过数据绑定来更新我的文本块

我还建议这个类中的方法无论如何都不是连接到WPF项目的最佳方法,但他只是将其作为一个示例来编写,以发现如何连接这两个项目

最终,我需要集成这样的类,这些类将运行不同的线程,以从动态源更新它们的数据,并使许多控件在我的应用程序中更新

到目前为止,我们能够从我的代码中实现这一点的唯一方法是:

    Partial Public Class SplashScreen

Dim NewText as String

    Public WithEvents Globals As globalclass = New globalclass
    Public Delegate Sub StringDelegate(ByVal Text As String)
    Public SplashText As String

Public Sub New()
    MyBase.New()
    Me.InitializeComponent()
    Me.Show()
    Globals.InitializeProgram()

End Sub

Public Sub UpdateSplashscreenHandler(ByVal Text As String) Handles Globals.UpdateSplashScreen

    StatusWindowText.Text = Text

End Sub
尽管WPF屏幕“冻结”直到“globalclass InitializeProgram”方法完成(txtStatusWindow.Text在未使用深奥的“刷新”扩展名的情况下在sub时不会更新…),但我完全相信我们的做法是错误的


关于集成和绑定到现有代码中的对象的例子很少。感谢您检查我们的小难题。

如果此状态窗口是XAML格式,而状态窗口是UserControl,则向状态窗口添加StatusText依赖项属性。然后,在XAML中,您可以使用以下内容绑定到该属性的值:

<UserControl x:Name="MyStatusWindow" ...>
  <TextBlock Text="{Binding Path=StatusText, ElementName=MyStatusWindow}" />
</UserControl>

然后,从事件中,只需更新StatusText属性的值

(这和你的要求很接近吗?)


另外,关于冻结:与在该类的构造函数中进行更新不同,您可能希望从该控件的已加载事件中进行更新。不过,除非你将其移动到另一个线程,否则它仍然会冻结。现在,这发生在运行UI消息泵的同一线程上。这是该UI的最新版本。

您是说不涉及XAML,而是直接从VB创建所有UI?StatusWindowText对象只是一个常用的文本框,因此它具有依赖属性。例程失败的原因是我们在类“globalclass”中调用sub的方式。sub不会更新调用表单“SplashScreen”,因为我们正在一个子例程中触发所有事件。当我们将事件分解成一个Select Case语句,并使用Dispatcher驱动它时,文本框很好地更新了。所以,结果证明MojoFilter是正确的!谢谢