locked
Binding to ObservableCollection not working RRS feed

  • Question

  • I have the following code:

     

    <StackPanel>
            <Button Content="Add Value" Command="{Binding AddValue}"/>
            <TextBlock Text="Values:"/>
            <ListBox ItemsSource="{Binding Values}"/>
        </StackPanel>
    

    partial class MainPage
        {
            public MainPage()
            {
                InitializeComponent();
                DataContext = new MainPageViewModel();
            }
        }
    

     

     

    public class MainPageViewModel : INotifyPropertyChanged
        {
            private ObservableCollection<string> _values = new ObservableCollection<string>() { "alpha", "beta", "gamma" };
            public ObservableCollection<string> Values { get { return _values; } }
    
            public event PropertyChangedEventHandler PropertyChanged;
            protected void OnPropertyChanged( string name )
            {
                if( null != PropertyChanged )
                {
                    PropertyChanged( this, new PropertyChangedEventArgs( name ) );
                }
            }
    
            public ICommand AddValue { get; private set; }
    
            public MainPageViewModel()
            {
                AddValue = new RelayCommand( OnExecuteAddValue );
            }
    
            private void OnExecuteAddValue( object context )
            {
                Values.Add( "meow" );
            }
        }
    

     

     

    I can verify that ExecuteAddValue is being called (hits breakpoint) and the Values collection is being updated with additional members, but the binding does not appear to be getting updated.  I remember reading something earlier about ObservableCollection bindings not working and there being a workaround.  Can anyone point me to that post?  


    • Edited by Robert Zhu Tuesday, October 4, 2011 9:38 AM
    Tuesday, October 4, 2011 9:38 AM

Answers

All replies

  • ObservableCollection<T> is using the other INotifyPropertyChanged. Oh, the mess. Not sure what's the story with INotifyCollectionChanged.

    Miha Markic [MVP C#] http://blog.rthand.com
    • Edited by Miha Markic Tuesday, October 4, 2011 10:38 AM
    Tuesday, October 4, 2011 10:37 AM
  • Hi Miha, yes this is a known issue with two INPC interfaces.  INCC has some known issues in the preview.  If you look at the databinding SDK sample you'll see a helper class for ObservableVector<T> that should help in some cases http://code.msdn.microsoft.com/windowsapps/Data-Binding-7b1d67b5
    Tim Heuer | Program Manager, XAML | http://timheuer.com/blog | @timheuer
    • Marked as answer by Robert Zhu Tuesday, October 4, 2011 5:18 PM
    Tuesday, October 4, 2011 3:46 PM
  • As others have stated, the issue is that WinRT uses IObservableVector, whereas ObservableCollection exposes INotifyCollectionChanged. To solve the problem I have created a little adapter that you can use within a value converter as follows:

    <ItemsControl ItemsSource="{Binding Path=MyCollection, Converter={StaticResource ObservableCollectionAdapter}}"/>
    

    You can read about it here:

    http://www.scottlogic.co.uk/blog/colin/2011/10/using-observablecollection-with-winrt-via-a-little-shim/

    Regards, Colin E.

    Thursday, October 6, 2011 7:40 AM
  • thanks Tim!

     

    Now taking this example if any of viewmodels are moved out of the MainPage.xaml.cs file then the databinding doesn't work.  Is this a known issue?

     

    For instance if you move Employee out into a separate .cs file then the databinding doesn't work.

    Monday, October 24, 2011 7:02 PM