Класс связывания проблем с сеткой, второе место

Поэтому я пытаюсь создать свой собственный музыкальный проигрыватель. У меня корректно обновляется Listview с текущим плейлистом. Моя проблема начинается, когда я хочу, чтобы сетка показывала песню, которая сейчас воспроизводится. При связывании с этими строками они все возвращают Null,

Из класса:

public class Song : INotifyPropertyChanged
{
    public string Title { get; set; }
    public string Path { get; set; }
    public string Artist { get; set; }
    public int Time { get; set; }
    public string Album { get; set; }
    //public ImageBrush Portrait { get; set; }
    public event PropertyChangedEventHandler PropertyChanged;


    public Song(string title, string path, string artist, int time, string album)//, ImageBrush portrait)
    {
        this.Path = path;
        this.Title = title;
        this.Artist = artist;
        this.Time = time;
        this.Album = album;
        //this.Portrait = portrait;
    }

    public string SongCurrentPlaying
    {
        get { return Title; }
        set
        {
            Title = value;
            OnPropertyChanged("SongCurrentPlaying");
        }
    }

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(Title));
        }
    }

Из XAML:

        <Grid HorizontalAlignment="Left" Height="143" VerticalAlignment="Top" Width="276">
            <Image HorizontalAlignment="Left" Height="124" Margin="10,10,0,0" VerticalAlignment="Top" Width="134" Stretch="Fill"/>
            <TextBlock HorizontalAlignment="Left" Margin="144,100,0,0" TextWrapping="Wrap" Text="{Binding Songs.Title}" VerticalAlignment="Top" Height="25" Width="122"/>
            <TextBlock HorizontalAlignment="Left" Margin="144,40,0,0" TextWrapping="Wrap" Text="{Binding SongCurrentPlaying.Title, PresentationTraceSources.TraceLevel=High}" VerticalAlignment="Top" Height="25" Width="122"/>
            <TextBlock HorizontalAlignment="Left" Margin="144,70,0,0" TextWrapping="Wrap" Text="{Binding Song.Title}" VerticalAlignment="Top" Height="25" Width="122"/>
            <TextBlock HorizontalAlignment="Left" Margin="144,10,0,0" TextWrapping="Wrap" Text="{Binding Songs.Title}" VerticalAlignment="Top" Height="25" Width="122"/>
        </Grid>

Как вы можете видеть, я экспериментировал с разными привязками, чтобы получить значения из заголовка, например, ни одна из них не была успешной.

2 ответа

Ваша классовая структура не имеет особого смысла. У тебя есть Song класс, который содержит Song информация. Тем не менее, этот класс также имеет место SongCurrentPlaying, Теперь, если вы хотите иметь SongCurentPlaying в том же классе, что и Song тогда я бы сузил вашу проблему до того, как вы выполняли привязки XAML. Я бы предположил, что DataContext вашего контроля не был установлен на экземпляр Song, например

public partial class MainWindow : Window
{
    public MainWindow()
    {
        var someSong = new Song(...);
        this.DataContext = someSong;
        InitializeComponent();
    }
}

Однажды установить в качестве DataContext Затем вы можете напрямую связать со свойствами класса (например, {Binding Title}).

Ваш класс песни не нужно реализовывать INotifyPropertyChanged, Вы должны думать о своих песнях как о моделях. Вместо этого вы должны сделать модель представления для вашего музыкального плеера, которая будет хранить всю вашу информацию для вашего представления, например, в этом случае CurrentSongPlaying,

Я бы сделал viewmodel это выглядит так

internal class SongPlayerViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

private Song _songPlaying;

public Song SongPlaying
{
  get { return _songPlaying; }
  set { 
    _songPlaying = value;
    OnPropertyChanged("SongPlaying");
  }
}



protected void OnPropertyChanged(string name)
{
  var handler = PropertyChanged;
  if (handler != null)
  {
    handler(this, new PropertyChangedEventArgs(name));
  }
}

}

Затем обязательно установите datacontext к экземпляру этого в представлении и внутри xaml просто свяжите заголовок с кодом, подобным этому.

настройка Datacontext

private readonly SongPlayerViewModel _viewModel = new SongPlayerViewModel();

public MainWindow() 
{
   InitializeComponent();
   DataContext = _viewModel;
}

пример привязки xaml для воспроизведения текущей песни

<TextBlock text="{Binding SongPlaying.Title}"/>

Если вы хотите что-то, когда ни одна песня не играет, посмотрите в Fallbackvalue

Другие вопросы по тегам