Binding Checkbox to ControlVisibility

  • WPF
  • .NET 5–6

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Binding Checkbox to ControlVisibility

    Hallo,

    meine Checkbox mag die Visibility einer DataGridColumn nicht anpassen.
    Hab mit dem Binding-Assistent da eigentlich ganz easy ein Binding erstellen können, und was rausgekommen ist, finde ich so auch im INet als Vorschläge, wie das denn zu tun sei.

    XML-Quellcode

    1. <CheckBox Content="Maßspalten" Name="chkMassspalten" Foreground="White" FontSize="14" FontWeight="Bold" Margin="2,5,0,0"/>

    XML-Quellcode

    1. <DataGridTextColumn Header="Breite" Binding="{Binding Breite}" ElementStyle="{StaticResource NumericTextStyle}"
    2. Visibility="{Binding IsChecked, Converter={StaticResource BooleanToVisibilityConverter}, ElementName=chkMassspalten}"/>

    EIne Idee was da hakt?

    Viele Grüße
    Hallo.

    Versuch mal folgendes: Erstelle ein Property (full und mit PropertyChanged) in deinem DataContext "CB_ischecked" und binde die Checkbox darauf. Danach folgt das ungewöhnliche Binding wie im XAML unten. Eigenschaften von Zeilen und Spalten im DataGrid lassen sich nicht einfach so binden, auch wenn es erst mal so aussieht und kein Fehlermeldungen erscheinen. Hatte da anfangs auch einige Probleme und dann diesen Code gefunden.

    XML-Quellcode

    1. <CheckBox IsChecked="{Binding CB_ischecked} Content="Maßspalten" Name="chkMassspalten" Foreground="White" FontSize="14" FontWeight="Bold" Margin="2,5,0,0"/>
    2. <FrameworkElement x:Name="dummyElement" Visibility="Collapsed"/>


    XML-Quellcode

    1. <DataGridTextColumn Header="Breite" Binding="{Binding Breite}" ElementStyle="{StaticResource NumericTextStyle}"
    2. Visibility="{Binding DataContext.CB_ischecked, Source={x:Reference dummyElement}, Converter={StaticResource BooleanToVisibilityConverter}}"/>


    Gruß
    eichseinet

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

    Folgendes funktioniert bei mir:

    XML-Quellcode

    1. <Grid>
    2. <Grid.RowDefinitions>
    3. <RowDefinition Height="50"/>
    4. <RowDefinition Height="*"/>
    5. </Grid.RowDefinitions>
    6. <Grid.Resources>
    7. <BooleanToVisibilityConverter x:Key="BTV_Key"/>
    8. </Grid.Resources>
    9. <CheckBox IsChecked="{Binding CB_isChecked}" Content="Sichtbar / Unsichtbar"/>
    10. <FrameworkElement x:Name="dummyElement" Visibility="Collapsed"/>
    11. <DataGrid ItemsSource="{Binding Daten}" Grid.Row="1" AutoGenerateColumns="False">
    12. <DataGrid.Columns>
    13. <DataGridTextColumn Header="Wert1" Binding="{Binding Wert1}"/>
    14. <DataGridTextColumn Header="Wert2" Binding="{Binding Wert2}"
    15. Visibility="{Binding DataContext.CB_isChecked,
    16. Source={x:Reference dummyElement}, Converter={StaticResource BTV_Key}}"/>
    17. </DataGrid.Columns>
    18. </DataGrid>
    19. </Grid>


    Die Klasse:

    VB.NET-Quellcode

    1. Public Class Class1
    2. Inherits Basisklasse
    3. Private _wert1 As String
    4. Public Property Wert1() As String
    5. Get
    6. Return _wert1
    7. End Get
    8. Set(ByVal value As String)
    9. _wert1 = value
    10. RaisePropertyChanged()
    11. End Set
    12. End Property
    13. Private _wert2 As String
    14. Public Property Wert2() As String
    15. Get
    16. Return _wert2
    17. End Get
    18. Set(ByVal value As String)
    19. _wert2 = value
    20. RaisePropertyChanged()
    21. End Set
    22. End Property
    23. End Class


    Der Code:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Runtime.CompilerServices
    3. Imports System.Collections.ObjectModel
    4. Class MainWindow
    5. #Region "Allgemein"
    6. Implements INotifyPropertyChanged
    7. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    8. Public Sub RaisePropertyChanged(<CallerMemberName> Optional prop As String = "") 'wird bei Änderung in den Propertys aufgerufen
    9. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(prop))
    10. End Sub
    11. #End Region
    12. #Region "Deklaration"
    13. Private _cb_ischecked As Boolean
    14. Public Property CB_isChecked() As Boolean
    15. Get
    16. Return _cb_ischecked
    17. End Get
    18. Set(ByVal value As Boolean)
    19. _cb_ischecked = value
    20. RaisePropertyChanged()
    21. End Set
    22. End Property
    23. Private _daten As New ObservableCollection(Of Class1)
    24. Public Property Daten() As ObservableCollection(Of Class1)
    25. Get
    26. Return _daten
    27. End Get
    28. Set(ByVal value As ObservableCollection(Of Class1))
    29. _daten = value
    30. RaisePropertyChanged()
    31. End Set
    32. End Property
    33. #End Region
    34. Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    35. Me.DataContext = Me
    36. For i = 0 To 2
    37. Daten.Add(New Class1 With {.Wert1 = "Testwert" & i.ToString, .Wert2 = "bin da oder weg"})
    38. Next
    39. End Sub
    40. End Class
    Gegenfrage; funktioniert meine Version denn bei dir?
    Da muss doch nur das Property erstellt und darauf gebunden werden. Den ganzenRest hab ich ja nur erstellt um ein Projekt zu haben.
    Binding an Rows und Columns is nich so wie üblich, obwohl nix meckert und die Software es sogar selbst so erstellt.

    Noch was; ist dein Converter auch als Resource im XAML angelegt? Der Name sieht aus als versuchst du nen direkten Zugriff auf den Converter. Allerdings würde das Projekt dann gleich mit nem Fehler den Start verweigern.

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

    Den Converter legt der Assistent selbst so mit an als Ressource

    Ich habe es mit diesem Framework-Element probiert, oder per Extra-Property, wie gesagt ohne Erfolg.

    Ich habe bisher kein Testprojekt, mit nur deinem Code versucht.

    An sich stört mich die Extraproperty auch gewaltig, denn ob ich auf eine Property binde in meinem Context oder auf eine Property von nem anderen Control sollte erstmal keinen Unterschied machen. Warum also die Redundanz einfügen?
    Wenn du also den von mir gesendeten Code 1:1 kopierst funktioniert es nicht? Bei mir klappt das.
    Außerdem erscheint bei deiner Methode sofort ein Bindingfehler: "Kann das Element nicht finden". Gemeint ist die Checkbox.
    An anderen Stellen funktioniert das, hier halt eben nicht.
    Folgendes funktioniert aber:

    XML-Quellcode

    1. <DataGridTextColumn Header="Wert2" Binding="{Binding Wert2}"
    2. Visibility="{Binding Path=IsChecked, Source={x:Reference CB}, Converter={StaticResource BTV_Key}}"/>
    IsThreeState hat keine Auswirkungen.

    Source statt ElementName funktioniert.
    Den Binding Fehler den du bei ElementName erhältst hab ich nicht, aber das wäre auch komisch, denn wie gesagt den Code tippe ich nicht selbst; mach ich alles mit dem Assistenten.

    Bluespide schrieb:

    Das gibt es doch nicht vom System?
    Doch