WPF и VB.net: привязка данных к отдельному классу, созданная вне Expression Blend - PullRequest
0 голосов
/ 08 октября 2010

У меня есть приложение 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

Мне нужно иметь возможность вызывать sub "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 не использует эзотерическое расширение «refresh» ...), я полностью уверен, что мы собираемся это неправильный путь.

Есть несколько примеров, касающихся интеграции, а затем привязки к объектам в существующем коде. Спасибо за проверку нашего маленького затруднения.

1 Ответ

0 голосов
/ 08 октября 2010

Если это окно состояния находится в XAML, а окно состояния представляет собой UserControl, добавьте свойство зависимостей StatusText в окно состояния.Затем в XAML вы можете связать со значением этого свойства что-то вроде:

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

Затем из вашего события просто обновите значение этого свойства StatusText.

(Isэто даже близко к тому, что вы спрашивали?)

Кроме того, об этом замораживании: вместо того, чтобы делать это обновление в конструкторе этого класса, вы можете сделать это из события Loaded этого элемента управления.Это все равно будет зависать, если только вы не переместите его в отдельный поток.Прямо сейчас это происходит в том же потоке, на котором работает насос сообщений пользовательского интерфейса.Это Диспетчер для этого интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...