2016-05-07 3 views
2

Je fais une liste simple avec peu d'options. Voici comment il ressemble: enter image description hereAccès ListView CellTemplate UIElements

  • boutons apparaissent lorsque frappé ListViewItem et disparaissent lorsque le congé
  • Lorsque vous appuyez Play, puis ce bouton reste des changements visibles et contenu pour mettre fin à

Mon les problèmes sont:

  • Lorsque j'appuie sur Stop, alors ce bouton reste visible et les déclencheurs disparaissent:/

ce que je veux faire, mais je ne peux pas est:

  • Quand je puis appuyez sur Lecture curseur apparaît, sinon Collapsed

J'espère que quelqu'un peut me aider. Mon code ressemble à ceci jusqu'à présent:

XAML:

<ListView Name="lst"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <Button Name="btnDownload" Content="Download" Visibility="Hidden" MinWidth="100"/> 
          <Button Name="btnPlay" 
            Click="btnPlay_Click" 
            Content="Play" 
            Visibility="Hidden" 
            MinWidth="100"/> 
         </StackPanel> 
         <DataTemplate.Triggers> 
          <DataTrigger Binding="{Binding 
             RelativeSource={RelativeSource 
             Mode=FindAncestor, 
             AncestorType={x:Type ListViewItem}}, 
             Path=IsMouseOver}" 
             Value="True"> 
           <Setter TargetName="btnDownload" 
             Property="Visibility" 
             Value="Visible"/> 
           <Setter TargetName="btnPlay" 
             Property="Visibility" 
             Value="Visible"/> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn> 
       <GridViewColumn.Header> 
        <GridViewColumnHeader Tag="Name">Name</GridViewColumnHeader> 
       </GridViewColumn.Header> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel MinWidth="200"> 
          <TextBlock Text="{Binding Name}"/> 
          <Slider Name="Slider" Visibility="Visible"/> 
         </StackPanel> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

CS:

public partial class MainWindow : Window 
{ 
    public ListCollectionView MyCollectionView { get; set; } 
    public ObservableCollection<Songs> songs = new ObservableCollection<Songs>(); 
    public MainWindow() 
    { 
     InitializeComponent(); 
     MyCollectionView = new ListCollectionView(songs); 
     lst.ItemsSource = MyCollectionView; 

     songs.Add(new Songs(){Name = "Eminem - Superman"}); 
     songs.Add(new Songs(){Name = "Rihanna - Please don't stop the music"}); 
     songs.Add(new Songs(){Name = "Linkin Park - Numb"}); 
    } 

    private void btnPlay_Click(object sender, RoutedEventArgs e) 
    { 
     //Reset all songs 
     List<Button> buttons = FindVisualChildren<Button>(lst).ToList(); 
     foreach (Button button in buttons) 
     { 
      button.Content = "Play"; 
      //Loosing Triggers 
     } 

     //Play current 
     Button btn = sender as Button; 
     btn.Visibility = Visibility.Visible; 
     btn.Content = "Stop"; 
    } 

    private IEnumerable<T> FindVisualChildren<T>(DependencyObject obj) where T : DependencyObject 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
      if (child != null && child is T) 
      { 
       yield return (T)child; 
      } 
      else 
      { 
       var childOfChild = FindVisualChildren<T>(child); 
       if (childOfChild != null) 
       { 
        foreach (var subchild in childOfChild) 
        { 
         yield return subchild; 
        } 
       } 
      } 
     } 
    } 
} 
public class Songs : INotifyPropertyChanged 
{ 
    private string name; 
    public string Name 
    { 
     get { return name; } 
     set 
     { 
      if (name != value) 
      { 
       name = value; 
       NotifyPropertyChanged("Name"); 
      } 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    public void NotifyPropertyChanged(string propName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
    } 
} 

Projet:

MusicList.sln

Et ofcourse - désolé pour mon mauvais anglais :)

Répondre

1

Vous pouvez créer un convertisseur de valeur qui prendrait le texte de votre bouton et renverrait une valeur de visibilité basée sur la valeur du texte. Quelque chose comme ça;

public class StringToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var buttonText = (string) value; 
     switch (buttonText.ToLower()) 
     { 
      case "stop": 
       return Visibility.Visible; 
      default: 
       return Visibility.Collapsed; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Créer une instance de cette classe dans votre XAML en créant une ressource statique et l'ajouter dans votre dictionnaire de ressources par exemple quelque chose comme ça; Puis, associez la visibilité de votre curseur au texte de votre bouton;

<Slider Name="Slider" Visibility="{Binding ElementName=btnPlay, Path=Content, Converter={StaticResource StringToVisibilityConverter}}"/> 
+1

Modifié: Path = Texte à Path = contenu, cas « play » pour « arrêter » et curseur ElementName = atteindre n'arrivaient btnPlay, donc je devrais mettre le bouton btnPlay à la cellule curseur et tout fonctionne finaly! THX! – nrkz