Nie zmienia się image w datagridzie po zmiany ścieżki dostępu

0

Witam :)
Mam DataGrida z obrazkiem w pierwszej kolumnie. Każdy item ma stringa przechowującego ścieżkę do obrazka wyświetlanego (obrazek symbolizuje stany utworu np. odtwarzany, error, readytoplay itp.).

namespace MediaPlayer
{
    /// <summary>
    /// Interaction logic for cPlayList.xaml
    /// </summary>
    public partial class cPlayList : UserControl
    {
        public cPlayList()
        {
            InitializeComponent();
            hPlayList.ItemsSource = TrackList;
            AddTrack("C:\\Users\\Świdwa\\Desktop\\UTWORY\\Abba - Mamma Mia.mp3");
            CurrentPlaying = TrackList[0];
        }
        private cPC PC = new cPC();

        public ObservableCollection<cTrack> TrackList = new ObservableCollection<cTrack>();
        
        // Aktualnie odtwarzany
        private cTrack currentPlaying { get; set; }
        public cTrack CurrentPlaying
        {
            get
            {
                return currentPlaying;
            }
            set
            {
                if(currentPlaying != null)
                    currentPlaying.SetIcon(cTrack.eTrackStatus.ready);
                currentPlaying = value;
                if (currentPlaying != null)
                    currentPlaying.SetIcon(cTrack.eTrackStatus.play);
                PC.OnPropertyChanged("CurrentPlaying");
            }
        }
        
        // Add Track
        public bool AddTrack(string Path)
        {
            if (!File.Exists(@Path) || !RequiredTrackCondition(Path))
                return false;
            TrackList.Add(new cTrack(Path));
            return true;
        }
        private bool RequiredTrackCondition(string Path)
        {
            int IndexOfAmp = Path.IndexOf('.');
            if (IndexOfAmp == -1)
                return false;
            string amp = Path.Substring(IndexOfAmp + 1);
            switch (amp.ToLower())
            {
                case "mp3": return true;
                case "wave": return true;
                case "ogg": return true;
                case "mp4": return true;
                case "wav": return true;
                case "bmp": return true;
                case "png": return true;
                case "gif": return true;
                case "3gp": return true;
                case "4gp": return true;
                case "avi": return true;
                case "wmv": return true;
                case "m3p": return true;
                case "m4p": return true;
            }
            return false;
        }

        // Drop Down
        private void hPlayList_Drop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
            {
                e.Effects = DragDropEffects.All;
                string[] DroppedFiles = (string[])e.Data.GetData(DataFormats.FileDrop);

                foreach (string file in DroppedFiles)
                {
                    if (file.IndexOf('.') == -1)
                        hPlayList_DropDirectory(file);
                    else
                        AddTrack(file);
                }
            }
        }
        private void hPlayList_DropDirectory(string veriable)
        {
            string[] filePath = Directory.GetFiles(veriable);
            foreach (string Path in filePath)
            {
                if (Path.IndexOf('.') == -1)
                    hPlayList_DropDirectory(Path);
                else
                    AddTrack(Path);
            }
        }

        // Delete Track
        private void PlayListKeyDown(object sender, KeyEventArgs e)
        {
            MoveNextTrack(); return;
            var grid = (DataGrid)sender;
            if (Key.Delete == e.Key)
            {
                int count = hPlayList.SelectedItems.Count;
                if (count <= 0)
                    return;
                var LastItem = (cTrack)hPlayList.SelectedItems[count - 1];
                while (hPlayList.SelectedItems.Count > 1)
                {
                    if ((hPlayList.SelectedItems[0] as cTrack).TrackIcon == "Textures\\Play16.png")
                        CurrentPlaying = null;
                    TrackList.Remove((cTrack)hPlayList.SelectedItems[0]);
                }
                int index = hPlayList.Items.IndexOf(LastItem);
                TrackList.Remove((cTrack)LastItem);
                if (index >= hPlayList.Items.Count)
                    index = hPlayList.Items.Count - 1;
                if (index >= 0)
                {
                    hPlayList.SelectedItem = hPlayList.Items[index];
                    hPlayList.CurrentCell = new DataGridCellInfo(hPlayList.Items[index], hPlayList.Columns[1]);

                }
            }
        }
        // Change Played
        private void MoveNextTrack()
        {
            if (TrackList.Count == 0 || CurrentPlaying == null)
               return;
            int currIndex = TrackList.IndexOf(CurrentPlaying);
            ++currIndex;
            if (currIndex >= TrackList.Count)
                currIndex = 0;
            CurrentPlaying = TrackList[currIndex];
        }
        private void MovePrevTrack()
        {
            if (TrackList.Count == 0 || CurrentPlaying == null)
                return;
            int currIndex = TrackList.IndexOf(CurrentPlaying);
            --currIndex;
            if (currIndex < 0)
                currIndex = TrackList.Count-1;
            CurrentPlaying = TrackList[currIndex];
        }
        
    }
    public class cTrack
    {
        public cTrack(string Path)
        {
            this.Name = Path;
            this.Time = Path;
            this.Path = Path;
            SetIcon(eTrackStatus.ready);
        }
        private cPC PC = new cPC();
        public enum eTrackStatus
        {
            ready,
            play,
            error,
            next1,
            next2,
            next3,
            next4,
            next5,
            next6,
            next7,
            next8,
            next9
        }

        // Iconpath
        public void SetIcon(eTrackStatus icon)
        {
            TrackIcon = IconPath(icon);
        }
        private string IconPath(eTrackStatus select)
        {
            switch(select)
            {
                case eTrackStatus.ready:
                    return "Textures\\Ready16.png";
                case eTrackStatus.play:
                    return "Textures\\Play16.png";
                case eTrackStatus.error:
                    return "Textures\\Error16.png";
                case eTrackStatus.next1:
                    return "Textures\\Next16.png";
            }
            return "";
        }
        private string trackIcon;
        public string TrackIcon
        {
            get { return this.trackIcon; }
            private set
            {
                this.trackIcon = value;
                PC.OnPropertyChanged("TrackIcon");
            }
        }
        // Name, Path and Time
        private string name;
        public string Name { 
            get
            {
                return name;
            }
            private set
            {
                try
                {
                    string Path = value;
                    name = Path.Substring(Path.LastIndexOf('\\') + 1, Path.LastIndexOf('.') - Path.LastIndexOf('\\') - 1);
                }
                catch
                {
                    name = "none";
                }
                PC.OnPropertyChanged("Name");
            }
        }
        private string time;
        public string Time
        {
            get
            {
                return time;
            }
            private set
            {
                try
                {
                    var player = new WindowsMediaPlayer();
                    var clip = player.newMedia(value);
                    if (clip != null)
                        time = clip.durationString;
                    else
                        time = "error";
                    player.close();
                }
                catch
                {
                    time = "error";
                }
                PC.OnPropertyChanged("Time");
            }
        }
        private string path;
        public string Path
        {
            get
            {
                return path;
            }
            private set
            {
                try
                {
                    path = value;
                }
                catch
                {
                    path = "";
                }
                PC.OnPropertyChanged("Path");
            }
        }
    
    }
    public class cPC : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string propertyName)
        {
            var handler = this.PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
} 
<UserControl x:Class="MediaPlayer.cPlayList"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <DataGrid x:Name="hPlayList" IsReadOnly="True" CanUserResizeRows="False" GridLinesVisibility="None" AutoGenerateColumns="False"  HeadersVisibility="Column" AllowDrop="True" CanUserDeleteRows="False" Drop="hPlayList_Drop" PreviewKeyDown="PlayListKeyDown">
            <DataGrid.Columns>
                <!--definicje kolumn-->
                <DataGridTemplateColumn Header=" " CanUserResize="False" MaxWidth="16" MinWidth="16">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Image Source="{Binding Path=TrackIcon}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" CanUserResize="False" Width="*"/>
                <DataGridTextColumn Header="Time" Binding="{Binding Path=Time}" CanUserResize="False" MaxWidth="42" MinWidth="42"/>
            </DataGrid.Columns>
            <!--Zmiana zaznaczenia-->
            <DataGrid.CellStyle>
                <Style TargetType="DataGridCell">
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <!--Zaznaczenie-->
                            <Setter Property="Background" >
                                <Setter.Value>
                                    <RadialGradientBrush>
                                        <GradientStop Color="#FF7EC13B" Offset="0.159"/>
                                        <GradientStop Color="#7F22932C" Offset="1"/>
                                    </RadialGradientBrush>
                                </Setter.Value>
                            </Setter>
                            <Setter Property="Foreground" Value="Black" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.CellStyle>
            <DataGrid.RowStyle>
                <Style TargetType="DataGridRow">
                    <Style.Triggers>
                        <Trigger Property="IsSelected"
                        Value="True">
                            <Setter Property="BorderBrush"
                        Value="Blue" />
                            <Setter Property="BorderThickness"
                        Value="0,1" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>
        </DataGrid>
    </Grid>
</UserControl>
 

jak widać wszystko jest zbindowane, OnPropertyChange też powinno działać. Nie wiem o co chodzi :( Obrazek zmienia się dopiero jak przewinę scrollbarem tak, aby element zniknął i potem jak przewine z powrotem to jest już ok.

da2cfa7ff1.png

Po wywołaniu metody MoveNextTrack() nutka powinna zniknąć z jednego i wskoczyć na kolejny utwór, niestety efekt wizualny dopiero jest widoczny po przewinięciu suwakiem.

0

Spróbuj użyć UpdateLayout()

0

Niestety to nie pomaga. Wstawiam cały projekt jakby ktoś chciał zobaczyć.

0

Spojrzałby ktoś na kod? Bo nie mam już siły wertować te google od rana :(

0

Nie działa mi na 100% event propertyChange, co robię w nim źle?

1

No i jakoś tak wszystko co do tej pory napisaliśmy jakby poszło w pustkę:

  • Nie korzystaj z notacji węgierskiej;
  • Zamiast public ObservableCollection<cTrack> TrackList zrób public IList<cTrack> TrackList;
  • Po kilku własnościach w XAML post chociaż Enter, bo tak przewijać kilometry w prawo to niewygodnie;
  • Playlista jako osobny UserControl jest niepotrzebna, bo to i tak jest tylko DataGrid;
  • Bindujesz ikonę do własności TrackIcon, a jednocześnie nigdzie jej nie ustawiasz.;
  • Własności dotyczące utworu muszą być zapięte w osobnej klasie...;
  • ...i dopiero do tej klasy robisz binding elementów datagridu, jako kolekcji obiektów;
  • Jeżeli elementy tabeli mają się aktualizować to ta klasa musi implementować INotifyPropertyChanged;
  • Wybrany wiersz binduj do jako SelectedItem do obiektu cTrack;
  • Brak UpdateSourceTrigger=PropertyChanged. Jeżeli zmieniasz widok z kodu pod spodem to bez tego i tak nie wie on nic o zmianach;
  • ... więcej pewnie jeszcze by się znalazło.

Spojrzałby ktoś na kod? Bo nie mam już siły wertować te google od rana

Tego kodu to nawet ja nie rozumiem, pisząc bardziej z uśmiechem niż z brakiem skromności rzecz jasna, bo guru ze mnie żaden :) Naprawdę... przeleć sobie jakiś tutorial z WPF, najlepiej od razu z wykorzystaniem mvvm.

0

Dlaczego jak użyłem tej klasy to nie działało, a jak wkleiłem te 2 metody do wnętrza klasy elementu datagrida to działa?

public class cPC : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string propertyName)
        {
            var handler = this.PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    } 

1 użytkowników online, w tym zalogowanych: 0, gości: 1