2010-03-25 4 views
3

Pour une raison quelconque, je ne peux pas masquer DataGridColumn de WPF Toolkit. Je suis en train de faire ce qui suit:WPF Masquer DataGridColumn via une liaison

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

Cela ne fonctionne pas, car il est à la recherche d'une propriété IsReadOnly sur le ItemSource (pas une propriété de la classe actuelle). Si vous ajoutez ceci en tant que propriété de la classe ItemSource qui implémente INoifyPropertyChanged, elle ne masque toujours pas la colonne. Y a-t-il un moyen de contourner ceci? Je souhaite que la colonne soit masquée lorsqu'un clic sur un bouton modifie la propriété IsReadOnly.

On suppose IsReadOnly retourne une valeur de visibilité et est une propriété de dépendance

Je suis complètement coincé, je voudrais vraiment apprécier l'aide! Merci beaucoup!

Répondre

5

Si vous voulez lier à la propriété de IsReadOnlyDataGridColumn, ajoutez juste un RelativeSource à la liaison (et un convertisseur):

<BooleanToVisibilityConverter x:Key="boolToVis" /> 

... 

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

, il ressemble aussi this StackOverflow question pourrait être lié à votre problème .

-1

vous devez utiliser un convertisseur

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 

vous utilisez le convertisseur dans le XAML. SAMPLE

+0

Supposons que IsReadOnly renvoie déjà une valeur de visibilité, ce n'est pas mon problème, mon problème est que la grille de données ne veut pas le respecter –

+0

ok..silly question. Sur votre propriété VM IsReadOnly avez-vous OnPropertyChanged ("IsReadOnly") dans votre setter? Je sais parfois que j'oublie de faire cela et que l'IU ne réagira pas sans cela. – ecathell

+2

La classe BooleanToVisibilityConverter existe déjà dans System.Windows.Controls, pas besoin de la recréer;) –

6

Publié dans cette question:

WPF DataGrid: Binding DataGridColumn visibility to ContextMenu MenuItems Ischeked (MVVM)

Fubzot utilise le code de liaison similaire à

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

Vous pouvez également consulter ce:

Forwarding the DataGrid’s DataContext to its’ columns..

qui est aussi lin ked dans la question ci-dessus. Juste pour mon information: Voyez-vous des erreurs de liaison dans votre fenêtre de sortie en utilisant votre code actuel?

+0

Merci beaucoup, c'est très similaire à la réponse ci-dessous. J'ai vu des erreurs de liaison, donc je savais que j'avais des problèmes :( –

+0

Heureux que ça fonctionne et fonctionne maintenant. –