Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6242575
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 24, 20262026-05-24T11:58:50+00:00 2026-05-24T11:58:50+00:00

In my WPF app, I have an ItemsControl whose items values are dependant upon

  • 0

In my WPF app, I have an ItemsControl whose items values are dependant upon the previous item displayed.

The ViewModel is an audio file split into parts of variable length, and i need to display it in such manner, with a DateTime displayed on the right, and that’s what i need to calculate (I only know each part’s length, i need to calculate the actual time it starts and ends, and the position on the ItemsControl).

--
  ----
      ------------
                  --
                    --------------------

My first approach was to use an ObservableCollection<MyviewModel> but soon enough some horrors occured :

5-way multibinding in which’s IMultiValueConverter I’d calculate the value to return and set a property of the DataContext to that value, because I only knew the previous element at runtime.

The previous element was sent using a binding on Relativesource.PreviousData.

Now my problem is that after setting a value from the Converter (which is obviously a bad thing), and actually getting it to work, a regular Collection doesn’t have a notion of order in its elements, so when further down the road when i want to add an audio part in the middle of the rest, the display is messed up.

Furthermore, when I’ll implement more business logic, I may need to access the audio parts’s start and end that are calculated in this converter, and what if it’s not displayed yet…?

So that approach was wrong on several levels.

That’s where i started googling and found out about LinkedList. Now I’m trying to make a class that is basically an Observable LinkedList (I don’t need it to be generic):

public class ObservableSegmentLinkedList : LinkedList<MyViewModel>, INotifyCollectionChanged
    {
        //Overrides ???

        #region INotifyCollectionChanged Members

        public event NotifyCollectionChangedEventHandler CollectionChanged;
        public void OnNotifyCollectionChanged(NotifyCollectionChangedEventArgs e)
        {
            if (CollectionChanged != null)
            {
                CollectionChanged(this, e);
            }
        }

        #endregion
    }

And the heart of the problem is that i can’t override the methods that modify the collection (Addfirst, AddLast etc), so i can’t call OnNotifyCollectionChanged properly…

So I’m thinking i could make overloads for each of these methods, but that sounds quite nasty…

In short: I need some kind of collection in which each item knows details of the previous one in order to calculate one of its own properties.

Any clues? is this even a good solution?

Thanks!

Appendix, the ViewModel looks like:

public class MyViewModel : INotifyPropertyChanged
    {
        private DateTime m_SegmentLength;
        public DateTime SegmentLength
        {
            get { return m_SegmentLength; }
            set
            {
                m_SegmentLength = value;
                NotifyPropertyChanged("SegmentLength");
            }
        }

        private DateTime m_SegmentAdvert;
        public DateTime SegmentAdvert
        {
            get { return m_SegmentAdvert; }
            set
            {
                m_SegmentAdvert = value;
                NotifyPropertyChanged("SegmentAdvert");
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String prop)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }

        #endregion
    }

EDIT: i think i will try to combine Thomas and Will’s answers: I’ll use composition (i.e I keep an instance of LinkedList in my custom object instead of inheriting from it) and redefine methods that are meant to be used (AddAfter, AddFirst etc) in which i’ll just call OnNotifyPropertychanged after calling the actual LinkedList method. It’s a bit of work but i guess there won’t be any elegant solution to my problem…

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-24T11:58:50+00:00Added an answer on May 24, 2026 at 11:58 am

    Ok now, I made a custom generic class that supports IEnumerable and is used as if it was a LinkedList<T>, with the only difference that WPF gets notified of the changes.

    Please note that this solution only works for a reasonably small collection, I only have to manage around 30 elements max, so it’s fine for me, but everytime you modify this collection, it is considered “Reset”.

    Here goes the solution:

        /// <summary>
        /// This class is a LinkedList that can be used in a WPF MVVM scenario. Composition was used instead of inheritance,
        /// because inheriting from LinkedList does not allow overriding its methods.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class ObservableLinkedList<T> : INotifyCollectionChanged, IEnumerable
        {
            private LinkedList<T> m_UnderLyingLinkedList;
    
            #region Variables accessors
            public int Count
            {
                get { return m_UnderLyingLinkedList.Count; }
            }
    
            public LinkedListNode<T> First
            {
                get { return m_UnderLyingLinkedList.First; }
            }
    
            public LinkedListNode<T> Last
            {
                get { return m_UnderLyingLinkedList.Last; }
            }
            #endregion
    
            #region Constructors
            public ObservableLinkedList()
            {
                m_UnderLyingLinkedList = new LinkedList<T>();
            }
    
            public ObservableLinkedList(IEnumerable<T> collection)
            {
                m_UnderLyingLinkedList = new LinkedList<T>(collection);
            }
            #endregion
    
            #region LinkedList<T> Composition
            public LinkedListNode<T> AddAfter(LinkedListNode<T> prevNode, T value)
            {
                LinkedListNode<T> ret = m_UnderLyingLinkedList.AddAfter(prevNode, value);
                OnNotifyCollectionChanged();
                return ret;
            }
    
            public void AddAfter(LinkedListNode<T> node, LinkedListNode<T> newNode)
            {
                m_UnderLyingLinkedList.AddAfter(node, newNode);
                OnNotifyCollectionChanged();
            }
    
            public LinkedListNode<T> AddBefore(LinkedListNode<T> node, T value)
            {
                LinkedListNode<T> ret = m_UnderLyingLinkedList.AddBefore(node, value);
                OnNotifyCollectionChanged();
                return ret;
            }
    
            public void AddBefore(LinkedListNode<T> node, LinkedListNode<T> newNode)
            {
                m_UnderLyingLinkedList.AddBefore(node, newNode);
                OnNotifyCollectionChanged();
            }
    
            public LinkedListNode<T> AddFirst(T value)
            {
                LinkedListNode<T> ret = m_UnderLyingLinkedList.AddFirst(value);
                OnNotifyCollectionChanged();
                return ret;
            }
    
            public void AddFirst(LinkedListNode<T> node)
            {
                m_UnderLyingLinkedList.AddFirst(node);
                OnNotifyCollectionChanged();
            }
    
            public LinkedListNode<T> AddLast(T value)
            {
                LinkedListNode<T> ret = m_UnderLyingLinkedList.AddLast(value);
                OnNotifyCollectionChanged();
                return ret;
            }
    
            public void AddLast(LinkedListNode<T> node)
            {
                m_UnderLyingLinkedList.AddLast(node);
                OnNotifyCollectionChanged();
            }
    
            public void Clear()
            {
                m_UnderLyingLinkedList.Clear();
                OnNotifyCollectionChanged();
            }
    
            public bool Contains(T value)
            {
                return m_UnderLyingLinkedList.Contains(value);
            }
    
            public void CopyTo(T[] array, int index)
            {
                m_UnderLyingLinkedList.CopyTo(array, index);
            }
    
            public bool LinkedListEquals(object obj)
            {
                return m_UnderLyingLinkedList.Equals(obj);
            }
    
            public LinkedListNode<T> Find(T value)
            {
                return m_UnderLyingLinkedList.Find(value);
            }
    
            public LinkedListNode<T> FindLast(T value)
            {
                return m_UnderLyingLinkedList.FindLast(value);
            }
    
            public Type GetLinkedListType()
            {
                return m_UnderLyingLinkedList.GetType();
            }
    
            public bool Remove(T value)
            {
                bool ret = m_UnderLyingLinkedList.Remove(value);
                OnNotifyCollectionChanged();
                return ret;
            }
    
            public void Remove(LinkedListNode<T> node)
            {
                m_UnderLyingLinkedList.Remove(node);
                OnNotifyCollectionChanged();
            }
    
            public void RemoveFirst()
            {
                m_UnderLyingLinkedList.RemoveFirst();
                OnNotifyCollectionChanged();
            }
    
            public void RemoveLast()
            {
                m_UnderLyingLinkedList.RemoveLast();
                OnNotifyCollectionChanged();
            }
            #endregion
    
            #region INotifyCollectionChanged Members
    
            public event NotifyCollectionChangedEventHandler CollectionChanged;
            public void OnNotifyCollectionChanged()
            {
                if (CollectionChanged != null)
                {
                    CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
                }
            }
    
            #endregion
    
            #region IEnumerable Members
    
            IEnumerator IEnumerable.GetEnumerator()
            {
                return (m_UnderLyingLinkedList as IEnumerable).GetEnumerator();
            }
    
            #endregion
        }
    

    As mentionned by @AndrewS in the comments, LinkedListNode should be replaced with a custom class that returns an ObservableLinkedList from its List property.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have an image in a C# WPF app whose build action is set
I have a WPF app that has a combobox with lookup items. The combobox
I'm creating a WPF app and have a system tray icon with a context
Context: I have a WPF App that uses certain unmanaged DLLs in the D:\WordAutomation\MyApp_Source\Executables\MyApp
I have a WPF app which snaps to screen edges (I just set the
I have a WPF App which is grinding to a halt after running out
I have a WPF App that implements a ListView. I would like to show
I have a WPF app in which I need to programatically manipulate at runtime.
I have a WPF app that is using the MVVM pattern. Hooking up buttons
I have a wpf app that needs to communicate(exchange data) with a custom designed

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.