2016-05-07 3 views
2

Я делаю простой список с несколькими вариантами. Вот как это выглядит следующим образом: появляется enter image description hereAccess ListView CellTemplate UIElements

  • Кнопка при попадании в ListViewItem и исчезают, когда отпуск
  • При нажатии Play, то эта кнопка остается видимым и контент изменения Остановить

Моих проблемы:

  • Когда я нажимаю Stop, тогда эта кнопка остается видимой и триггеры исчезают:/

Что еще я хочу сделать, но я не могу есть:

  • Когда я нажимаю Play затем появляется ползунок, в противном случае Collapsed

Я надеюсь, что кто-то может мне помочь. Мой код выглядит следующим образом до сих пор:

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)); 
    } 
} 

Проект:

MusicList.sln

И конечно же - извините за мой плохой английский :)

ответ

1

Вы можете создать конвертер значений, который примет текст вашей кнопки и вернет значение видимости на основе текстового значения. Что-то вроде этого;

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(); 
    } 
} 

Создать экземпляр этого класса в вашем XAML путем создания статического ресурса и добавить его в свой словарь ресурсов, например, что-то вроде этого;

<Window.Resources> 
    <myNamespace:StringToVisibilityConverter x:Key="StringToVisibilityConverter"/> 
</Window.Resources> 

Затем привяжите видимость слайдера к тексту кнопки;

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

Отредактировано: Path = Текст Путь = Содержание, случай «игра», чтобы «остановить» и Slider could'nt достигают ElementName = btnPlay, поэтому я должен поставить кнопку btnPlay для Slider ячейки и, наконец все работает! Спасибо! – nrkz