WPF Sembunyikan DataGridColumn melalui pengikatan

Untuk beberapa alasan saya tidak dapat menyembunyikan DataGridColumn WPF Toolkit. Saya mencoba melakukan hal berikut:

<dg:DataGridTemplateColumn Header="Item Description" Visibility="{Binding IsReadOnly}">
<dg:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <TextBox Text="{Binding Path=ItemDescription}" />
    </DataTemplate>
</dg:DataGridTemplateColumn.CellTemplate>

This doesn't work, since it's looking for a IsReadOnly property on the ItemSource (not a property of the current class). If add this as a property of the ItemSource class that implements INoifyPropertyChanged, it still doesn't hide the column. Is there a way around this? I want the column to hid when a button click changes IsReadOnly property.

Asumsikan IsReadOnly mengembalikan nilai Visibilitas dan merupakan properti ketergantungan

Saya benar-benar buntu, saya sangat menghargai bantuannya! Terima kasih banyak!


person Greg R    schedule 25.03.2010    source sumber


Jawaban (3)


Jika Anda ingin mengikat ke properti IsReadOnly DataGridColumn, cukup tambahkan RelativeSource ke Binding (dan konverter):

<BooleanToVisibilityConverter x:Key="boolToVis" />

...

<dg:DataGridTemplateColumn Header="Item Description" Visibility="{Binding IsReadOnly, RelativeSource={RelativeSource Self}, Converter={StaticResource boolToVis}}">

Selain itu, sepertinya pertanyaan StackOverflow ini mungkin terkait dengan masalahmu.

person Abe Heidebrecht    schedule 25.03.2010

Diposting dalam pertanyaan ini:

WPF DataGrid: Mengikat visibilitas DataGridColumn ke ContextMenu MenuItems Ischeked (MVVM)

Fubzot menggunakan kode pengikatan yang mirip dengan

Visibility='{Binding (FrameworkElement.DataContext).IsReadOnly,
RelativeSource={x:Static RelativeSource.Self}}'

Anda mungkin juga ingin melihat ini:

Meneruskan DataContext DataGrid ke kolomnya..

yang juga terkait dengan pertanyaan di atas.

Sekadar informasi saya: Apakah Anda melihat kesalahan Pengikatan di jendela Output menggunakan kode Anda saat ini?

person Ed Gonzalez    schedule 25.03.2010
comment
Terima kasih banyak, ini sangat mirip dengan jawaban di bawah ini. Saya memang melihat kesalahan pengikatan, jadi saya tahu saya punya masalah :( - person Greg R; 26.03.2010

Anda perlu menggunakan konverter

 Public Class BooleanToVisibilityConverter
        Implements IValueConverter
        Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.Convert
            If targetType Is GetType(Visibility) Then
                If CBool(value) = True Then
                    Return Visibility.Hidden
                Else
                    Return Visibility.Visible
                End If
            Else
                Return Nothing
            End If
        End Function

        Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
            Return Nothing
        End Function
    End Class

maka Anda menggunakan konverter di XAML. CONTOH

person ecathell    schedule 25.03.2010
comment
Asumsikan IsReadOnly sudah mengembalikan nilai visibilitas, itu bukan masalah saya, masalah saya adalah jaringan data tidak mau menghormatinya - person Greg R; 25.03.2010
comment
oke..pertanyaan konyol. Di properti VM Anda, IsReadOnly, apakah Anda memiliki OnPropertyChanged(IsReadOnly) di setter Anda? Saya tahu terkadang saya lupa melakukan itu dan UI tidak akan bereaksi tanpanya. - person ecathell; 25.03.2010
comment
Kelas BooleanToVisibilityConverter sudah ada di System.Windows.Controls, tidak perlu membuatnya ulang;) - person Thomas Levesque; 25.03.2010