Benutzersteuerelement unsichtbar machen per Code

  • WPF

Es gibt 62 Antworten in diesem Thema. Der letzte Beitrag () ist von PadreSperanza.

    Genau, du hast wiedermal (!!!!) Den Namespace falsch imoprtiert. Lerne bitte aus Fehlern.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Lerne bitte aus Fehlern.


    Ich tu mein Bestes. Bin grad am Kämpfen mit deinem Kapitel "Binding über DataTemplates" und dem neuen Tut von ErfinderDesRades...

    Ich bin gerade dabei, meine Liste mit den ViewModels zu initialisieren und es wird nix angezeigt wenn ich das Projekt starte... Wenn ich nix vergessen habe sollte es eigentlich funktionieren. Aber ich glaube ich weiss den Fehler:

    Meine MainWindow.xaml erbt nicht von der ViewModelBase, daher wird nix "gegettet":

    VB.NET-Quellcode

    1. Class MainWindow
    2. Inherits ViewModel.Instrastructure.ViewModelBase


    Die Fehlermeldung sagt, dass sich die für die MainWindow-Klasse festgelegte ViewModel-Basisklasse nicht von der Windows-Basisklasse eines ihrer anderen partiellen Typen unterscheiden darf...

    Was ist da gemeint mit "partiellem Typ"?

    Ansonsten, ist das so korrekt oder wird das nicht funktionieren?:

    VB.NET-Quellcode

    1. Public Property Meine4Viewmodels As ObservableCollection(Of ViewModel.Instrastructure.ViewModelBase)
    2. Get
    3. _MeineViewmodels.Add(New ViewModel.SucheViewModel)
    4. _MeineViewmodels.Add(New ViewModel.PlattendecksViewModel)
    5. _MeineViewmodels.Add(New ViewModel.EqualizerViewModel)
    6. _MeineViewmodels.Add(New ViewModel.SettingsViewModel)
    7. MessageBox.Show("abgerufen!")
    8. Return _MeineViewmodels
    9. End Get
    10. Set(value As ObservableCollection(Of ViewModel.Instrastructure.ViewModelBase))
    11. _MeineViewmodels = value
    12. RaisePropertyChanged()
    13. MessageBox.Show("geändert!")
    14. End Set
    15. End Property

    kafffee schrieb:

    Meine MainWindow.xaml erbt nicht von der ViewModelBase

    Um gottes willen, das soll sie doch auch nicht.

    Was macht ein ViewModel Objekt in der View?

    Grundsätzlich hast du mal nichts in deinem MainWindow (mal abgeshen von deinem Startview).
    Alles weitere steuerst du über die ViewModels. Du musst das Konzept verinnerlichen.

    Du hast von mir ja bereits ein funktionierendes Beispiel bekommen, das schau dir genau an und versuche zu verstehen was da passiert. Verstehst du etwas nicht frag nach.
    Jetzt wild drauf los zu "versuchen" wird nicht nicht ans Ziel bringen, du musst lernen es zu verstehen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Um gottes willen, das soll sie doch auch nicht.

    Da hast du Recht, um Gottes Willen!! X/ War mein Fehler, was ich meinte war natürlich die MainWindow.xaml.vb...


    Nofear23m schrieb:

    Du hast von mir ja bereits ein funktionierendes Beispiel bekommen, das schau dir genau an und versuche zu verstehen was da passiert

    Bin grad dabei...

    kafffee schrieb:

    was ich meinte war natürlich die MainWindow.xaml.vb

    Kommt ja aufs gleicher raus. Hat in der komplettem Projektmappe nix zu suchen. und in der MainWindow.vb schon garnicht.

    Wo hast du dir das abgeguckt????

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    kafffee schrieb:

    VB.NET-Quellcode

    1. Class MainWindow
    Das ist doch das CodeBehind vom MainWindow.xaml.
    Wenn du MVVM lernen willst, hast du da nichts verloren - garnix!
    CodeBehind-Files sind nur dazu da, um sie wieder zu schliessen, wenn sie sich geöffnet haben, weil man im Xaml-Designer ungeschickt irgendwo drauf gedoppelklickst hat.

    Merke: Xaml = View
    CodeBehind = Codebehind von Xaml = also auch: View
    View ist aber nicht Viewmodel
    Wenn das also eines nicht tut, dann von ViewModelBase erben (oder von sonst einer hand-coded Klasse).
    Ah okay. Also diese Datei einfach ignorieren. Das dachte ich mir schon. Hab vorher schon versucht mir in der View eine MainView.xaml und im Viewmodel eine MainViewModel zu erstellen und bin daran gescheitert, dass ich in den Projekteinstellungen diese MainView als Startseite oder wie das heisst nicht festlegen konnte... Da hab ichs dann gelassen... Wie kann ich dann meine MainView sonst als Startscreen festlegen?

    Edit: Ah okay, einfach ein MainView als UserControl anlegen und dann einfach in die MainWindow.xaml einbinden...

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

    ich würd sagen, das MainWindow ist das MainView.
    Ein UserControl ist ein View (bzw View-Element) - es ist kein MainView.
    /klugsch... off

    kafffee schrieb:

    Wie kann ich dann meine MainView sonst als Startscreen festlegen?
    Schau in die App.Xaml von mein Tut. Da (und in vmtl. jedem anderen lauffähigen BeispielCode auch) ist das MainWindow als StartupWindow festgelegt.

    Aber deine Frage ist bischen wirr, man weiss bei dir nicht, was du unter MainView bzw Startscreen eiglich verstehst.

    kafffee schrieb:

    einfach ein MainView als UserControl anlegen und dann einfach in die MainWindow.xaml einbinden

    Jo, das ist der richtige Weg, um das UserControl zum Anwendungs-Start angezeigt zu bekommen.
    Aber ein UserControl kannst du natürlich nicht als Startscreen festlegen.
    Jedenfalls nicht, wenn mit "StartScreen" das StartupWindow gemeint ist.
    Weil ein UserControl ist ja kein Window.

    Das klingt jetzt alles wie Korinthenkackerei, aber von so Unklarheiten rühren dann auch Programmierfehler her - wie etwa der Versuch, das MainWindow von ViewmodelBase erben zu lassen.

    Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Jou hab alles hinbekommen bzgl. der MainView, der Vererbung der ViewModelBase usw. und hab jetzt richtig schön Struktur in meinem Projektmappen-Explorer...

    Auch in meiner Listbox im Navigationsbereich links, die an meine Property Meine4ViewModels As ObservableCollection(Of ViewModelBase) gebunden ist, werden meine Icons angezeigt.

    Leider werden meine vier Views im rechten grösseren Teil des Bildschrims noch nicht angezeigt. Ich hab das ContentControl.Content auch korrekt ans AusgewähltesViewModel As ViewModelBase, jedenfalls laut IntelliSense.

    Auch, wenn ich einen Haltepunkt setze, dann auf eins der Icons klicke, wird AusgewähltesViewModel korrekt gesetzt. Wird irgendwas "optisches" sein, obwohl ich meine Application.xaml schon durchgeschaut hab und auf den ersten Blick nichts gefunden... :(
    Und wirft das Propertie ​AusgewähltesViewModel auch PropertiyChanged() ?

    Zeig mal den Code wo du das Zuweist.
    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    VB.NET-Quellcode

    1. ​Private _AusgewähltesViewModel As ViewModel.Instrastructure.ViewModelBase = New ViewModel.SucheViewModel
    2. Public Property AusgewähltesViewModel As ViewModel.Instrastructure.ViewModelBase
    3. Get
    4. Return _AusgewähltesViewModel
    5. End Get
    6. Set(value As ViewModel.Instrastructure.ViewModelBase)
    7. _AusgewähltesViewModel = value
    8. RaisePropertyChanged()
    9. End Set
    10. End Property


    Und:

    XML-Quellcode

    1. <ContentControl Content="{Binding AusgewähltesViewModel, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1">
    2. <ContentControl.Resources>
    3. <DataTemplate DataType="{x:Type viewmodel:SucheViewModel}">
    4. <View:Suche/>
    5. </DataTemplate>
    6. <DataTemplate DataType="{x:Type viewmodel:PlattendecksViewModel}">
    7. <View:PlattendecksView/>
    8. </DataTemplate>
    9. <DataTemplate DataType="{x:Type viewmodel:EqualizerViewModel}">
    10. <View:EqualizerView/>
    11. </DataTemplate>
    12. <DataTemplate DataType="{x:Type viewmodel:SettingsViewModel}">
    13. <View:SettingsView/>
    14. </DataTemplate>
    15. </ContentControl.Resources>
    16. </ContentControl>



    Ich hab auch schon das ContentControl direkt auf Meine4ViewModels gebunden, und dann in der Listbox IsSynchronizedWithCurrentItem = True zu setzen, aber da passiert auch nichts.
    Hallo

    Und du hast in der Ausgabe keine Bindingfehler??

    kafffee schrieb:

    und dann in der Listbox IsSynchronizedWithCurrentItem = True zu setzen

    Welche Listbox, ich sehe hier keine Listbox??

    Du musst uns bitte schon alle relevanten Dinge mitteilen.
    Du willst ja die View "umschalten" also steuern welcher content umgeschaltet wird wenn du auf ein Icon klickst. Was braucht es dazu eine Listbox??

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    XML-Quellcode

    1. <ListBox ItemsSource="{Binding Meine4Viewmodels}" SelectionMode="Single" IsSynchronizedWithCurrentItem="True">
    2. <ListBox.ItemTemplate>
    3. <DataTemplate>
    4. <Canvas Grid.Column="1" Name="icoContent" Style="{StaticResource Navigationssymbol}" Width="32" Height="32" VerticalAlignment="Center" HorizontalAlignment="Center">
    5. <Path Fill="{DynamicResource VordergrundfarbeBrush}" Data="{Binding Icon}"/>
    6. </Canvas>
    7. </DataTemplate>
    8. </ListBox.ItemTemplate>
    9. </ListBox>


    Nofear23m schrieb:

    Du willst ja die View "umschalten" also steuern welcher content umgeschaltet wird wenn du auf ein Icon klickst. Was braucht es dazu eine Listbox??


    Na wie in deinem Kapitel "Binding über DataTemplates" oder auch ErfinderDesRades neues Tutorial über die 4 Views...
    Moment, moment, moment.

    Wir dürfen nun nicht Kraut und Rüben durcheinander würfeln.
    Soweit ich das verstanden habe hast du Links ein "Menü", also ein paar Buttons und rechts hast du deinen "Content". Diesen "content" willst du austauschen ja nachdem was Links für ein Button gedrückt wird.
    Da brauchste keine Listbox.

    Du hast rechts ein ContentControl. Diesem weist du den Content zu (mittels Binding wie du es hast)
    KEINE LISTBOX. du willst ja links nicht eine Liste von Content Anzeigen, sondern immer nur einen Content gleichzeitig. Richtig?

    Also.
    Ein ContentControl und gut ist.

    Du hast mir immer noch nicht mitgeteilt ob du Bindingfehler in der Ausgabe hast. Hast du nämlich in diesem Fall sicher. Und wenn du diese liest kommst du sicher selbst auf deinen Logikfehler.
    Deshalb: Diese Fehler IMMER lesen und dem nachgehen.

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Wir dürfen nun nicht Kraut und Rüben durcheinander würfeln.
    Soweit ich das verstanden habe hast du Links ein "Menü", also ein paar Buttons und rechts hast du deinen "Content". Diesen "content" willst du austauschen ja nachdem was Links für ein Button gedrückt wird.

    Ganz genau soweit richtig verstanden.


    Nofear23m schrieb:

    Du hast mir immer noch nicht mitgeteilt ob du Bindingfehler in der Ausgabe hast. Hast du nämlich in diesem Fall sicher. Und wenn du diese liest kommst du sicher selbst auf deinen Logikfehler.

    Yep hab nachgeschaut und den Fehler gefunden. War tatsächlich ein Bindingfehler (in Zusammenhang mit dem falschen DataContext). Danke für den Tipp! Jetzt wird mir rechts das SucheView angezeigt wie gewollt und in Post 32 im ersten Code in Zeile 1 festgelegt. Bloss wenn ich dann links auf ein Icon klicke, bleibt die ViewSuche bestehen, obwohl AusgewähltesViewModel den richtigen Wert zugewiesen bekommt... Hab ich überprüft...

    Nofear23m schrieb:

    Du hast rechts ein ContentControl. Diesem weist du den Content zu (mittels Binding wie du es hast)

    Ich hatte das von ErfinderDesRades so interpretiert, da er ja, wenn ich das Beispiel richtig verstanden hab, gesagt hat, man solle links eine Listbox und rechts ein ContentControl an dieselbe Meine4ViewModels = ObservableCollection(Of ViewmodelBase) binden, und in der Listbox dann SynchronizedWithCurrentItem = True machen. Ich hab dann in jedem meiner vier Viewmodels noch eine Eigenschaft Icon angelegt, mit dem String der das XAML-Icon enthält, um das dann in der Listbox anzuzeigen. Aber kann sein dass ich ihn da missverstanden hab.

    Also du bist der Meinung ich sollte links einfach ein paar Buttons (in einem Stackpanel o.Ä. organisisiert) oder ähnliches nehmen??

    kafffee schrieb:

    Ich hatte das von ErfinderDesRades so interpretiert, da er ja, wenn ich das Beispiel richtig verstanden hab, gesagt hat, man solle links eine Listbox

    Ja, das macht man wenn man ein Dynamisches Menü hat was in deinem Fall nicht der Fall ist ,da kann mans auch "einfach" halten. Ich will dich ja nicht überfordern. ;)

    kafffee schrieb:

    Bloss wenn ich dann links auf ein Icon klicke, bleibt die ViewSuche bestehen, obwohl AusgewähltesViewModel den richtigen Wert zugewiesen bekommt... Hab ich überprüft...

    Gut. Nun ist ja wieder alles anders und du hast nun eine andere Grundlage (keine Listbox).

    Poste nun mal deinen XAML von dem ContentControl (ich will das Binding mal sehen)
    Poste dann noch das ViewModel (Das mit dem Button-Command - also den Icons - und wo die Eigenschaft ​AusgewähltesViewModel eben vorhanden ist.)

    Falls Bindingfehler vorhanden bitte diese auch Posten. (Keine Screenshots, sondern immer in Textform bitte, das Hilft anderen später mal mit der Google Suche).

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Gut. Nun ist ja wieder alles anders und du hast nun eine andere Grundlage (keine Listbox).

    Gut, ich denke ich nehme da ToggleButtons. Die ham so eine schöne Eigenschaft IsChecked. Da pack ich dann mein Canvas rein. Aber da werd ich denke ich wahrscheinlich wieder das gleiche Problem wie mit der Listbox-Darstellung haben, nämlich dass ein Klick nur registriert wird, wenn ich auf einen nicht transparenten Teil des Icons klicke... (wie hier: Über x:key festgelegten Style innerhalb eines DataTemplates verwenden)

    <Edit>Vielleicht kann ich das ja umgehen indem ich statt auf eine IsChecked-Eigenschaft zu binden einen Command benutze, um AusgewähltesViewModel zu setzen... </Edit>
    <Edit2> Okay also das mit dem Klick auch auf einen transparenten Bereich funktioniert. Bloss meine View rechts ändert sich wieder nicht...:

    VB.NET-Quellcode

    1. Private _ZeigeEqualizer As ICommand
    2. Public ReadOnly Property ZeigeEqualizer() As ICommand
    3. Get
    4. If _ZeigeEqualizer Is Nothing Then _ZeigeEqualizer = New RelayCommand(AddressOf ZeigeEqualizer_Execute, Function(o) True)
    5. Return _ZeigeEqualizer
    6. End Get
    7. End Property
    8. Private Sub ZeigeEqualizer_Execute(obj As Object)
    9. AusgewähltesViewModel = New ViewModel.EqualizerViewModel
    10. End Sub

    Der Command selbst funktioniert... Auch AusgewähltesViewModel wird gegettet... Und richtig gesetzt. Was also ist das Problem??
    </Edit2>

    Nofear23m schrieb:

    Falls Bindingfehler vorhanden bitte diese auch Posten.

    Scheint alles gut zu sein...

    Meine Codes:

    XML-Quellcode

    1. <ContentControl Content="{Binding AusgewähltesViewModel, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1">
    2. <ContentControl.Resources>
    3. <DataTemplate DataType="{x:Type viewmodel:SucheViewModel}">
    4. <View:Suche/>
    5. </DataTemplate>
    6. <DataTemplate DataType="{x:Type viewmodel:PlattendecksViewModel}">
    7. <View:PlattendecksView/>
    8. </DataTemplate>
    9. <DataTemplate DataType="{x:Type viewmodel:EqualizerViewModel}">
    10. <View:EqualizerView/>
    11. </DataTemplate>
    12. <DataTemplate DataType="{x:Type viewmodel:SettingsViewModel}">
    13. <View:SettingsView/>
    14. </DataTemplate>
    15. </ContentControl.Resources>
    16. </ContentControl>


    und:

    VB.NET-Quellcode

    1. Imports System.Collections.ObjectModel
    2. Public Class MainViewModel
    3. Inherits Instrastructure.ViewModelBase
    4. Private _MeineViewmodels As New ObservableCollection(Of ViewModel.Instrastructure.ViewModelBase)
    5. Public Property Meine4Viewmodels As ObservableCollection(Of ViewModel.Instrastructure.ViewModelBase)
    6. Get
    7. _MeineViewmodels.Add(New ViewModel.SucheViewModel)
    8. _MeineViewmodels.Add(New ViewModel.PlattendecksViewModel)
    9. _MeineViewmodels.Add(New ViewModel.EqualizerViewModel)
    10. _MeineViewmodels.Add(New ViewModel.SettingsViewModel)
    11. Return _MeineViewmodels
    12. End Get
    13. Set(value As ObservableCollection(Of ViewModel.Instrastructure.ViewModelBase))
    14. _MeineViewmodels = value
    15. RaisePropertyChanged()
    16. End Set
    17. End Property
    18. Private _AusgewähltesViewModel As ViewModel.Instrastructure.ViewModelBase = New ViewModel.SucheViewModel
    19. Public Property AusgewähltesViewModel As ViewModel.Instrastructure.ViewModelBase
    20. Get
    21. Return _AusgewähltesViewModel
    22. End Get
    23. Set(value As ViewModel.Instrastructure.ViewModelBase)
    24. _AusgewähltesViewModel = value
    25. RaisePropertyChanged()
    26. End Set
    27. End Property
    28. End Class

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „kafffee“ ()

    Wattis das denn??

    VB.NET-Quellcode

    1. Imports System.Collections.ObjectModel
    2. Public Class MainViewModel
    3. Inherits Instrastructure.ViewModelBase
    4. Private _MeineViewmodels As New ObservableCollection(Of ViewModel.Instrastructure.ViewModelBase)
    5. Public Property Meine4Viewmodels As ObservableCollection(Of ViewModel.Instrastructure.ViewModelBase)
    6. Get
    7. _MeineViewmodels.Add(New ViewModel.SucheViewModel)
    8. _MeineViewmodels.Add(New ViewModel.PlattendecksViewModel)
    9. _MeineViewmodels.Add(New ViewModel.EqualizerViewModel)
    10. _MeineViewmodels.Add(New ViewModel.SettingsViewModel)
    11. Return _MeineViewmodels
    12. End Get
    13. Set(value As ObservableCollection(Of ViewModel.Instrastructure.ViewModelBase))
    14. _MeineViewmodels = value
    15. RaisePropertyChanged()
    16. End Set
    17. End Property
    jedesmal, wenn die Property abgerufen wird werden neue Viewmodelse in die _MeineViewmodels getan?
    Also aus meinem Tut hast du das nicht.