ObservableCollection

Я опубликовал еще одну ветку, посвященную обновлению списка Silverlight. Тем временем я немного познакомился с этой проблемой. Это связано с реализацией интерфейса ObservableCollection.

Я использую службы RIA для заполнения списка коллекцией типа ObservableCollection. Проблема заключается в обновлении элементов после обновления базы данных. Я использую дочернее окно Silverlight для сохранения данных в базе данных, и это происходит правильно при закрытии дочернего окна.

Может ли кто-нибудь дать мне больше информации о том, почему ListBox не обновляется.

Спасибо


person Greg    schedule 28.06.2010    source источник
comment
вы пробовали этот listboxName.UpdateLayout();   -  person Malcolm    schedule 28.06.2010
comment
Убедитесь, что для привязки данных не установлено значение OneTime. Вы уверены, что базовый источник данных обновляется?   -  person DaveB    schedule 29.06.2010
comment
Похоже, что базовый источник данных не обновляется после обновления базы данных. Вы можете это подтвердить? Используете ли вы двустороннюю привязку в списке?   -  person Myles J    schedule 01.07.2010
comment
извините, я некоторое время не занимался этим. DaveB. Да, базовый источник данных обновляется правильно. Myles. Я использую одностороннюю привязку в списке.   -  person Greg    schedule 14.07.2010
comment
Вообще-то, Дэйв, Майлз, я думаю, вы правы. БД обновляется, но источник данных может быть нет. Список загружает записи на основе выбора, сделанного в сетке данных. Итак, скажем, я выбираю строку 1 в сетке данных, список заполняется правильно. Затем я добавляю новый элемент в список. База данных обновляется, но не список. Если я выберу строку 2, а затем снова выберу строку 1, новая запись отобразится в списке — должен быть источник данных? - Если да, то как исправить?   -  person Greg    schedule 14.07.2010


Ответы (1)


Вам нужно сделать ваш класс poco, который используется в вашей ObservableCollection, реализует INotifyChanged.

Пример:

<viewModels:LocationsViewModel x:Key="viewModel" />
.
.
.    
<ListView
    DataContext="{StaticResource viewModel}"
    ItemsSource="{Binding Locations}"
    IsItemClickEnabled="True"
    ItemClick="GroupSection_ItemClick"
    ContinuumNavigationTransitionInfo.ExitElementContainer="True">

    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Name}" Margin="0,0,10,0" Style="{ThemeResource ListViewItemTextBlockStyle}" />
                <TextBlock Text="{Binding Latitude, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{ThemeResource ListViewItemTextBlockStyle}" Margin="0,0,5,0"/>
                <TextBlock Text="{Binding Longitude, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{ThemeResource ListViewItemTextBlockStyle}" Margin="5,0,0,0" />
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

public class LocationViewModel : BaseViewModel
{
    ObservableCollection<Location> _locations = new ObservableCollection<Location>();
    public ObservableCollection<Location> Locations
    {
        get
        {
            return _locations;
        }
        set
        {
            if (_locations != value)
            {
                _locations = value;
                OnNotifyPropertyChanged();
            }
        }
    }
}

public class Location : BaseViewModel
{
    int _locationId = 0;
    public int LocationId
    {
        get
        {
            return _locationId;
        }
        set
        {
            if (_locationId != value)
            {
                _locationId = value;
                OnNotifyPropertyChanged();
            }
        }
    }

    string _name = null;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            if (_name != value)
            {
                _name = value;
                OnNotifyPropertyChanged();
            }
        }
    }

    float _latitude = 0;
    public float Latitude 
    { 
        get
        {
            return _latitude;
        }
        set
        {
            if (_latitude != value)
            {
                _latitude = value;
                OnNotifyPropertyChanged();
            }
        }
    }

    float _longitude = 0;
    public float Longitude
    {
        get
        {
            return _longitude;
        }
        set
        {
            if (_longitude != value)
            {
                _longitude = value;
                OnNotifyPropertyChanged();
            }
        }
    }
}

public class BaseViewModel : INotifyPropertyChanged
{
    #region Events
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion

    protected void OnNotifyPropertyChanged([CallerMemberName] string memberName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(memberName));
        }
    }
}
person Scott Nimrod    schedule 09.04.2014