C# zu VB Übersetzung - InlineAssignHelper

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Rootbob91.

    C# zu VB Übersetzung - InlineAssignHelper

    Kann mir jemand dabei helfen folgenden Code zu übersetzen:

    C#-Quellcode

    1. public MainViewModel()
    2. {
    3. SwitchViewsCommand = new DelegateCommand((parameter) => CurrentView = Activator.CreateInstance(parameter as Type));
    4. }


    Mein bisheriges Ergebnis in VB:

    VB.NET-Quellcode

    1. Sub New()
    2. SwitchViewsCommand = New DelegateCommand(Function(parameter) InlineAssignHelper(CurrentView, Activator.CreateInstance(TryCast(parameter, Type))))
    3. End Sub
    4. Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T
    5. target = value
    6. Return value
    7. End Function


    InlineAssignHelper ist rot unterkringelt und es kommt folgende Fehlermeldung:
    Fehler BC36651 Die Datentypen der Typparameter in der Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T-Methode können nicht von diesen Argumenten abgeleitet werden, da mehrere Typen möglich sind. Sie können diesen Fehler möglicherweise beheben, indem Sie die Datentypen explizit angeben. ...\ViewModel\MainViewModel.vb 27

    Habs schon versucht zu fixen, aber kann mir dort nicht helfen :/. ?( Und ja nach knapp 8 Jahren Mitgliedschaft habe ich selbstverständlich schon einen Converter benutzt...

    EDIT:
    Hier noch die CurrentView Eigenschaft.

    VB.NET-Quellcode

    1. Private _currentView As UserControl
    2. Public Property CurrentView As UserControl
    3. Get
    4. Return _currentView
    5. End Get
    6. Set
    7. _currentView = Value
    8. OnPropertyChanged()
    9. End Set
    10. End Property


    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rootbob91“ ()

    Was genau ist ​parameter für ein Wert?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hallo @Trade, parameter wird wie folgt übergeben:

    XML-Quellcode

    1. <Button Command="{Binding SwitchViewsCommand}" CommandParameter="{x:Type local:ManufacturerView}" />


    ManufacturerView sieht zum Beispiel so aus:

    XML-Quellcode

    1. <UserControl x:Class="ManufacturerView"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    6. xmlns:local="clr-namespace:MyApp"
    7. mc:Ignorable="d"
    8. d:DesignHeight="300" d:DesignWidth="300">
    9. <Grid>
    10. <TextBlock>Hersteller</TextBlock>
    11. </Grid>
    12. </UserControl>

    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Jo, ich denke ErfinderDesRades hat recht. Activator.CreateInstance gibt ein Object zurück, sodass Dein T nicht eindeutig bestimmt/festgelegt werden kann.
    Ich würde da aber auch keine generische Funktion verwenden, da die redundant ist. Caste das einfach in ein UserControl und weise es zu.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hmm, würde da nicht die Dynamik verloren gehen?
    Ich möchte ja eine neue Instanz des unbekannten / variabel überlieferten Typs erstellen.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Aber das ist doch immer ein UserControl, oder?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ja, dann passt es doch. Dann caste es halt zu ​UserControl und weise das ​CurrentView zu.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    EDR hat recht. In Vb.Net muss es so heissen. CreateInstance gibt ein Object zurück.

    VB.NET-Quellcode

    1. Private CurrentView As UserControl
    2. Public Sub New()
    3. SwitchViewsCommand = New DelegateCommand(Function(parameter) InlineAssignHelper(CurrentView, DirectCast(Activator.CreateInstance(GetType(UserControl), parameter), UserControl)))
    4. End Sub
    5. Public Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T
    6. target = value
    7. Return value
    8. End Function


    Eventuell könnte das DelegateCommand noch Probleme machen. Es müsste mit ICommand implementiert sein.
    Es müsste etwa so aussehen.

    Edit: Korrigiert danke @~blaze~

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    Hi
    da Activator.CreateInstance... bereits vom Typ UserControl ist, wäre DirectCast statt CType besser. Mich wundert's btw. dass der C#-Code so kompiliert. Wäre es ein generisches Argument, würde es vmtl. funktionieren, aber so gibt es keine Inferenz auf den Rückgabewert von Activator.CreateInstance.

    Viele Grüße
    ~blaze~
    Ich versuche dieses Gerüst hier nachzubauen.
    (Wenn Link nicht erlaubt, dann bitte entfernen, ich bin mir gerade nicht sicher).

    Ich möchte im Command der Buttons bestimmen, zu welchem View navigiert werden soll.
    Daher als Parameter das View angeben womit dann das SwitchViewsCommand arbeiten kann.

    XML-Quellcode

    1. <Button ... Command={Binding SwitchViewsCommand} CommandParameter={x:Type local:IrgendEinView1}/>

    XML-Quellcode

    1. <Button ... Command={Binding SwitchViewsCommand} CommandParameter={x:Type local:IrgendEinView2}/>

    XML-Quellcode

    1. <Button ... Command={Binding SwitchViewsCommand} CommandParameter={x:Type local:IrgendEinView3}/>


    Er nimmt den Typ entgegen, erzeugt eine neue Instanz davon und weist CurrentView die passende Instanz zu.
    @exc-jdbi: Jo, hab genau dieses Command umgesetzt.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Jetzt bin ich mir nicht ganz sicher, aber sollten die Command und CommandParameter nicht so heissen

    VB.NET-Quellcode

    1. ... Command="{Binding SwitchViewsCommand}" CommandParameter="{x:Type UserControl}"


    Ob man beim CommandParameter den gewünschten UserControl definieren kann, müsste ich zuerst ausprobieren.

    Freundliche Grüsse

    exc-jdbi

    Rootbob91 schrieb:

    Ich möchte im Command der Buttons bestimmen, zu welchem View navigiert werden soll.
    Das lässt sich auch ohne Commandparameter regeln - einfach mit einem Datatemplate.
    Genaugenommen mit so vielen DataTemplates, wie du Viewse hast.
    Im Xaml bindest du dann einen ContentPresenter an das Viewmodel deiner Wahl, und der ContentPresenter verwendet dann automatisch das für dieses Viewmodel geeignete DataTemplate.
    Mein Setup sieht so aus:

    XML Vorbereitungen
    Spoiler anzeigen

    XML-Quellcode

    1. <Window.DataContext>
    2. <VM:MainViewModel />
    3. </Window.DataContext>
    4. <Window.Resources>
    5. <DataTemplate DataType="{x:Type VM:MainViewModel}">
    6. <local:MainView />
    7. </DataTemplate>
    8. <DataTemplate DataType="{x:Type VM:ManufacturerViewModel}">
    9. <local:ManufacturerView />
    10. </DataTemplate>
    11. </Window.Resources>


    Das Binding ans ContentControl

    XML-Quellcode

    1. <ContentControl Content="{Binding CurrenView}" />


    Das ViewModel
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Namespace ViewModel
    2. Public Class MainViewModel
    3. Inherits ViewModelBase
    4. Private _SwitchViewsCommand As ICommand
    5. Public Property SwitchViewsCommand As ICommand
    6. Get
    7. Return _SwitchViewsCommand
    8. End Get
    9. Set(value As ICommand)
    10. _SwitchViewsCommand = value
    11. End Set
    12. End Property
    13. Private _currentView As Object
    14. Public Property CurrentView As Object
    15. Get
    16. Return _currentView
    17. End Get
    18. Set
    19. _currentView = Value
    20. OnPropertyChanged()
    21. End Set
    22. End Property
    23. Sub New()
    24. SwitchViewsCommand = New DelegateCommand(Function(parameter) InlineAssignHelper(CurrentView, Activator.CreateInstance(parameter.GetType())))
    25. End Sub
    26. Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T
    27. target = value
    28. Return value
    29. End Function
    30. End Class
    31. End Namespace


    Meine Intention war es, dass ich nun per Buttons im XAML die Views switchen kann.
    Daher ein zentralisiertes Command, welches das als Info übergibt zu welchem View geswitcht werden soll.

    Nach Möglichkeit soll alles im XAML ablaufen. Nix im Code-Behind (MVVM Style halt) und nur wenns muss per ViewModel.
    Klar, ich könnte für jeden Button ein Klick-Event machen, wo dann die CurrentView Property mit einer anderen Klasse instanziert wird, ich wollts aber irgendwie zentraler haben.

    PS: Vorm Rumspielen mit der Button Geschichte war CurrentView nicht Object... Ich wollts erstmal zum laufen kriegen und musste dafür spielen..
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rootbob91“ ()

    also du hast 3 Buttons, 3 DataTemplates, aber nur 1 DelegateCommand.
    Jo, dann braucht dieses natürlich Parameter, dass iwelche Unterscheidungen getroffen werden können.
    Einfacher wärs, wenn jeder Button sein eigenes Command hätte - das eine Command würde dann dieses Viewmodel aufs CurrentView legen, ein anderes ein anderes.
    Wie gesagt: Um welches View dazugehört, braucht man sich nicht zu kümmern.

    ErfinderDesRades schrieb:

    Jo, dann braucht dieses natürlich Parameter, dass iwelche Unterscheidungen getroffen werden können.

    Korrekt, dieses Problem hatte ich gehofft mit der obigen Vorgehensweise lösen zu können :/.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..