2014-10-28 1 views
0

Работа над всей концепцией шаблона медиатора и его использованием в wpf, и благодаря тем, кто помог до сих пор, я наткнулся на статью Сачи Барбер Code Project, в котором он принимает посредника, но приспосабливает его немного, чтобы сделать его немного более универсальным.Больше проблем с преобразованием C# в VB при работе с помощниками посредника в wpf

Я был в состоянии следовать логике его аргументов и (довольно приятно для изменения) почти все его примеры C# конвертируют красиво. Конечно, все бары! и что один из них является примером того, как вы фактически регистрируетесь для посредника. Для тех, кто не видел эту статью вы можете ссылаться на него here

кусок C# вызывает проблемы находится в конструкторе его примере, показанном ниже

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.Windows.Input; 


    namespace MediatorDemo 
    { 

    public class ReadersViewModel : ViewModelBase 
    { 
     private String readText = String.Empty; 


     public ReadersViewModel() 
     { 
      //register to the mediator for the 
      //UserWroteSomething message 
      Mediator.Instance.Register(

       //Callback delegate, when message is seen 
       (Object o) => 
       { 
       ReadText = (String)o; 
       }, ViewModelMessages.UserWroteSomething); 
     } 


     public String ReadText 
     { 
      get { return readText; } 
      set 
      { 
       readText = value; 
       NotifyChanged("ReadText"); 
      } 
     } 
    } 
} 

И онлайн конвертер Telerik дают из следующих

Imports System.Collections.Generic 
Imports System.ComponentModel 
Imports System.Linq 
Imports System.Text 
Imports System.Windows.Input 


Namespace MediatorDemo 
    Public Class ReadersViewModel 
     Inherits ViewModelBase 
     Private m_readText As [String] = [String].Empty 


     Public Sub New() 
      'register to the mediator for the 
      'UserWroteSomething message 

      'Callback delegate, when message is seen 
      Mediator.Instance.Register(Function(o As [Object]) 
      ReadText = DirectCast(o, [String]) 

End Function, ViewModelMessages.UserWroteSomething) 
     End Sub 


     Public Property ReadText() As [String] 
      Get 
       Return m_readText 
      End Get 
      Set 
       m_readText = value 
       NotifyChanged("ReadText") 
      End Set 
     End Property 
    End Class 
End Namespace 

Снова я полагаю, что это должно быть повесить так, как C# и vb записывают Linq, но я не могу понять, что это такое.

Я бы приветствовал любые предложения.

Большое спасибо

EDIT 1

Ну я делал некоторые игры вокруг и придумал следующее:

Mediator.Instance.Register(Function(ByVal o As Object) ReadText = DirectCast(o 


,[String]),ViewModelMessages.UserWroteSomething) 

Возникает очевидный вопрос, правильно ли это?

EDIT 2

Это определение регистрового метода, который я думаю, будет пролить дополнительный свет на то, что код пытается сделать.

''' <summary> 
    ''' Registers a Colleague to a specific message 
    ''' </summary> 
    ''' <param name="callback">The callback to use 
    ''' when the message it seen</param> 
    ''' <param name="message">The message to 
    ''' register to</param> 
    Public Sub Register(callback As Action(Of [Object]), message As ViewModelMessages) 
     internalList.AddValue(message, callback) 
    End Sub 
+2

Эта строка странная: «Функция окончания, ViewModelMessages.UserWroteSomething» Обычно это просто «Конечная функция». У вас могут быть проблемы с интервалом. – Kat

+0

Кроме того, нет конца функции. Конечная часть соответствует подстроке New(). Так что это странная линия, чтобы выскочить из никуда. Глядя на ваш материал C#, это, вероятно, короткая рука для строки «viewmodelmessages», которая плохо переводится. – Kat

+0

О, я знаю, что это странно, но если вы возьмете оригинал C# и запустите его через онлайн-конвертер Telerik (который, честно говоря, довольно хорош в большинстве случаев), вы получите то, что вы видите в нижнем окне. При дальнейшем отражении это, скорее всего, лямбда-выражение, а не linq, но оно все еще меня бросает. –

ответ

2

Приведенный ниже код действителен VB для параметра Action (of Object).

Mediator.Instance.Register(Sub(o As Object) ReadText = TryCast(o, String), ViewModelMessages.UserWroteSomething) 

Использование Function(o as Object) в вашем лямбда соответствует типу Predicate(of Object), который, вероятно, является причиной вам проблемы несоответствия типов.

Внутри лямбда, если TryCast терпит неудачу, тогда строковая переменная ReadText будет установлена ​​в Nothing.

Кроме того, удалите «[» и «] из всех ключевых слов, таких как Object и String, потому что этот синтаксис может привести к тому, что система будет обрабатывать символы как отличающиеся. Похоже, вы хотите, чтобы CLR Object и String там, откуда я могу сказать.

+0

Огромное спасибо, я отдам это и посмотрю, что произойдет –