2009-05-14 7 views
1

J'ai un ListView comme:tête Masquer listview programatically

 
Col1 Col2 Col3 
1  A  I 
2  B  II 
3  C  III 

J'utilise 2 boutons. Lorsque je clique sur le premier bouton, le Col3 devrait s'effondrer et il devrait être visible lors d'un clic dans le second bouton.

Une idée sur la façon de faire un tel ListView dans WPF?

Répondre

1

L'utilisation du pouce résoudra le problème. De même que

<ListView x:Name="MyListView"IsSynchronizedWithCurrentItem="True" 
      ItemsSource="{Binding Path=Items}", Mode=Default, 
      Source={StaticResource DataProvider}}" 
      Thumb.DragDelta="Thumb_DragDelta"> 


public Window1() 
{ 
    InitializeComponent(); 
    MyListView.AddHandler(Thumb.DragDeltaEvent, 
        new DragDeltaEventHandler(Thumb_DragDelta), 
        true); 

void Thumb_DragDelta(object sender, DragDeltaEventArgs e) 
{ 
    Thumb senderAsThumb = e.OriginalSource as Thumb; 
    GridViewColumnHeader header = senderAsThumb.TemplatedParent as GridViewColumnHeader;  
    if (header.Column.ActualWidth < MIN_WIDTH) 
    { 
    header.Column.Width = MIN_WIDTH; 
    } 
    if (header.Column.ActualWidth > MAX_WIDTH) 
    { 
     header.Column.Width = MAX_WIDTH; 
    } 
} 
} 
0

Pourriez-vous fournir un code xaml à quoi ressemble votre listview?

Vous pouvez lier un RelayCommand à votre bouton et transmettre le ListView en tant que paramètre. Ensuite, vous pouvez définir Visibilité = Faux.

<Button Command="{Binding MyButtonCommand} 
    CommandParameter="{Binding ElementName=Col3}" /> 

Ce serait votre cs:

ICommand _myButtonCommand; 
public ICommand MyButtonCommand 
{ 
    get 
    { 
     if (_myButtonCommand== null) _myButtonCommand= new RelayCommand(param => HideList(param)); 
     return _myButtonCommand; 
    } 
} 

void HideList(object param){ 
    (param as ListView).Visibility = False; 
} 

Je parle de RelayCommand comme dans l'exemple de Josh Smith: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
vous pouvez dl votre code.

Je suppose que vous pouvez obtenir un résultat similaire dans xaml uniquement avec des déclencheurs, mais je ne suis pas aussi expérimenté avec ce sujet.

+0

Quel espace de noms contient RelayCommand? – Sauron

+0

Vous devez créer votre propre classe RelayCommand. DL le code du lien que j'ai posté ci-dessus (ou prenez ce lien rapide: http://code.msdn.microsoft.com/mag200902MVVM/Release/ProjectReleases.aspx?ReleaseId=2026). "RelayCommand est une variante simplifiée de DelegateCommand" – Torsten

0

J'utilise le code comme

<Grid> 
    <ListView HorizontalContentAlignment="Stretch" Margin="38,12,31,110"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="COL1" Width="100"/> 
       <GridViewColumn Header="COL2" Width="100"/> 
       <GridViewColumn Header="COL3" Width="100"/> 
      </GridView> 
     </ListView.View> 
    </ListView> 
    <Button Height="25" HorizontalAlignment="Left" Margin="105,0,0,51" 
      Name="Collapse" VerticalAlignment="Bottom" Width="75" 
      Command="{Binding MyButtonCommand}"  
      CommandParameter="{Binding ElementName = COL3}">Collapse</Button> 
    <Button Height="25" HorizontalAlignment="Right" Margin="0,0,111,51" Name="Expand" 
      VerticalAlignment="Bottom" Width="75">Expand</Button> 
</Grid> 

et CS

ICommand _myButtonCommand; 
    public ICommand MyButtonCommand 
    { 
     get 
     { 
      if (_myButtonCommand== null) _myButtonCommand = new RelayCommand(param => HideList(param)); 
      return _myButtonCommand; 
     } 
    } 
    void HideList(object param) 
    { 
     (param as ListView).Visibility = Visibility.Hidden; 
    } 

u peut me donner une meilleure idée?

0

J'ai mis cette réponse comme un commentaire de votre message, mais je ne suis pas en mesure de commenter encore, alors ...

Vous devez nom (utiliser la propriété « Name ») l'élément que vous souhaitez accéder via "Binding ElementName" ou vous ne serez pas en mesure de l'obtenir. Dans votre cas, vous devez explicitement créer le GridViewColumnHeader, parce GridViewColumn n'a pas de propriété visibilty:

<GridViewColumnHeader Name="COL3">COL3</GridViewColumnHeader> 

Vous avez probablement aussi de créer explicitement le contenu de votre GridViewColumn si vous voulez le faire disparaître, cependant. Cela signifie que vous devez utiliser GridViewColumn.DisplayMemberBinding ou GridViewColumn.CellTemplate et leur attribuer un nom ou leur accéder via RelativeSource.

Jetez un oeil à cela pour les possibilités: http://www.wpfwiki.com/Default.aspx?Page=WPF%20Q5.3&AspxAutoDetectCookieSupport=1
Cependant, avez-vous pensé à utiliser un expandeur?

+0

Aucune propriété de nom disponible pour GridViewColumnHeader. – Sauron

+0

D'où avez-vous cette information? Si j'utilise intellisense ou simplement regarder la bibliothèque de msdn je peux trouver la propriété de nom: http://msdn.microsoft.com/fr-fr/library/system.windows.controls.gridviewcolumnheader_members.aspx Utilisez-vous une version .NET antérieure à la version 3.5? – Torsten

+0

une autre chose qui me vient à l'esprit est l'espace de noms xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml". Habituellement, il est ajouté par défaut, mais peut-être que vous devez utiliser celui-là. Ensuite, vous pouvez utiliser x: Name en tant que propriété. – Torsten

Questions connexes