Класс связывания проблем с сеткой, второе место
Поэтому я пытаюсь создать свой собственный музыкальный проигрыватель. У меня корректно обновляется 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