Источник списка не обновляется с источником - PullRequest
1 голос
/ 27 марта 2012

У меня есть 2 списка в моем XAML, и оба они являются множественными выборами.Я синхронизировал выбранные элементы списков, используя решение Самуэля Джека .

<ListBox x:Name="lbOrg" HorizontalAlignment="Left" Grid.Column="1" Grid.Row="0"
 Margin="15,3,5,3" Width="200" Height="120" ItemsSource="{Binding AvailableOrg}" 
LSync:MultiSelectorBehaviours.SynchronizedSelectedItems="{Binding SelectedOrg}" 
SelectionMode="Extended" DisplayMemberPath="OrgShortName"/>


<ListBox x:Name="lbSite" HorizontalAlignment="Left" Grid.Column="3" Grid.Row="0" 
Margin="15,3,5,3" Width="200" Height="120" ItemsSource="{Binding AvailableSites}"     
LSync:MultiSelectorBehaviours.SynchronizedSelectedItems="{Binding SelectedSites}"  
SelectionMode="Extended" DisplayMemberPath="SiteShortName"/>

lbSite необходимо заполнить в зависимости от значений, выбранных в lbOrg .Итак, чтобы сообщить ViewModel об изменении, выбранном для lbOrg , я обрабатываю событие изменения выбора для списка выбранных элементов для lbOrg и вызываю метод для заполнения значенийдля lbSite .

    public void Load()
    {            
        _selectedOrg = new ObservableCollection<object>();
        _selectedSites = new ObservableCollection<object>();            

        _selectedOrg.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(_selectedOrg_CollectionChanged);            
    }

    private void _selectedOrg_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {            
        if (AvailableSites != null)
            AvailableSites.Clear();            

        if(SelectedOrg != null && SelectedOrg.Count > 0)
        {
            foreach (object org in SelectedOrg)
            {
                if (AvailableSites == null || AvailableSites.Count == 0)
                    AvailableSites = WebClient.getSitesForOrg(((OrganizationModel)org).OrgId);
                else
                {
                    ObservableCollection<object> tempSiteList = WebClient.getSitesForOrg(((OrganizationModel)org).OrgId);
                    foreach (object site in tempSiteList)
                    {
                        AvailableSites.Add(site);
                    }
                }
            }
        }
    }

И я определил свойства следующим образом:

public ObservableCollection<object> SelectedOrg
    {
        get
        {
            return _selectedOrg;
        }
        set
        {
            _selectedOrg = value;                
            OnPropertyChanged("SelectedOrg");
        }
    }

public ObservableCollection<object> AvailableSites
    {
        get
        {
            return _availableSites;
        }
        set
        {
            _availableSites = value;
            OnPropertyChanged("AvailableSite");
        }
    }

Мой ViewModelBase реализует INotifyPropertyChanged. Кроме того,свойства определяются как ObservableCollection, где объект был приведен из отдельных пользовательских классов в обоих свойствах.

Я думаю, это должно было быть легко, но по какой-то странной причине список не получает уведомление о свойствеизменение и, следовательно, без изменений в источнике отражается на представлении.Я связал eventHandler с событием «Изменено выделение» lbOrg в коде, чтобы проверить, обновляется ли Itemssource для lbSite, но не имеет, хотя свойство AvailableSites имело требуемые значения.

Любая помощь здесьбудет принята с благодарностью.

1 Ответ

2 голосов
/ 27 марта 2012

Вы пропустили "с". :)

OnPropertyChanged("AvailableSite");

должно быть

OnPropertyChanged("AvailableSites");

У меня есть код в моей ViewModelBase, который проверяет строку в режиме отладки, это очень полезно для отлова таких ошибок:

[Conditional("DEBUG")]
private void CheckPropertyNameIsValid(string propertyName)
{
    // INotifyPropertyChanged notifies via strings, so use 
    // this helper to check that the string is accurate in debug builds.
    if (TypeDescriptor.GetProperties(this)[propertyName] == null)
        throw new Exception("Invalid property name: " + propertyName);
}

Существуют также различные элегантные решения, позволяющие полностью устранить зависимость от магических струн для INotifyPropertyChanged, но я пока не мог использовать ни одну из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...