2009-05-14 14 views
1

Ich habe eine ListView wie:ausblenden Listview-Header programmatisch

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

Ich benutze 2 Tasten. Wenn ich auf die erste Schaltfläche klicke, sollte der Col3 zusammenbrechen und beim Klicken auf die zweite Schaltfläche sichtbar sein.

Irgendeine Idee, wie man so ein ListView in WPF tut?

Antwort

1

Die Verwendung von Thumb löst das Problem. So wie

<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

Könnten Sie einen XAML-Code zur Verfügung stellen, wie Ihre Listview aussieht?

Sie könnten einen RelayCommand an Ihre Schaltfläche binden und die ListView als Parameter übergeben. Dann könnten Sie Sichtbarkeit = False setzen.

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

Dies wäre Ihr 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; 
} 

Ich spreche über RelayCommand wie in Josh Smiths Beispiel: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
Sie den Code dort dl kann.

Ich denke, Sie könnten ein ähnliches Ergebnis in XAML nur mit Triggern erreichen, aber ich bin nicht so erfahren mit diesem Thema.

+0

Welcher Namespace enthält RelayCommand? – Sauron

+0

Sie müssen Ihre eigene RelayCommand-Klasse erstellen. DL der Code von dem Link, den ich oben gepostet habe (oder diesen schnellen Link: http://code.msdn.microsoft.com/mag200902MVVM/Release/ProjectReleases.aspx?ReleaseId=2026). "RelayCommand ist eine vereinfachte Variante des DelegateCommand" – Torsten

0

Ich verwende den Code als

<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> 

und in 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; 
    } 

Can u mir eine bessere Vorstellung geben?

0

ich als Kommentar Ihrer Post diese Antwort gesetzt haben würde, aber ich bin nicht in der Lage noch zu kommentieren, so ...

Sie auf Namen („Name“ Eigenschaft verwenden) das Element auf die Sie über "Binding ElementName" zugreifen möchten, oder Sie werden nicht in der Lage sein, es zu bekommen. In Ihrem Fall sollten Sie explizit die Gridviewcolumnheader erstellen, weil keine Gridviewcolumn visibilty Eigenschaft hat:

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

Sie wahrscheinlich auch ausdrücklich den Inhalt Ihrer Gridviewcolumn erstellen, wenn Sie es verschwinden lassen wollen, though. Das heißt, Sie müssen GridViewColumn.DisplayMemberBinding oder GridViewColumn.CellTemplate verwenden und diesen auch einen Namen geben oder über RelativeSource darauf zugreifen.

Sehen Sie sich dies für die Möglichkeiten an: http://www.wpfwiki.com/Default.aspx?Page=WPF%20Q5.3&AspxAutoDetectCookieSupport=1
Haben Sie jedoch schon über einen Expander nachgedacht?

+0

Keine Name-Eigenschaft für GridViewColumnHeader verfügbar. – Sauron

+0

Woher haben Sie diese Information? Wenn ich intellisense oder einfach die msdn-Bibliothek anschaue, kann ich die Name-Eigenschaft finden: http://msdn.microsoft.com/de-de/library/system.windows.controls.gridviewcolumnheader_members.aspx Verwenden Sie eine .NET-Version älter als 3.5? – Torsten

+0

Eine andere Sache, die mir in den Sinn kommt, ist der Namespace xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml". Normalerweise wird es standardmäßig hinzugefügt, aber vielleicht musst du dieses verwenden. Dann könnten Sie x: Name als Eigenschaft verwenden. – Torsten

Verwandte Themen