WPF ObservableCollection CollectionView.CurrentChanged не запускается - PullRequest
2 голосов
/ 11 февраля 2010

У меня проблема с одним из моих ICollectionView с. Событие ICollectionView s CurrentChanged не запускается.

Пожалуйста, смотрите мой код ниже.

XAML:

            <!-- Publication -->
            <TextBlock Name="tbkPublication" Text="{x:Static abConst:Print.tbkPublicationText}" Grid.Row="0" Grid.Column="0" Margin="3" ></TextBlock>
            <ComboBox Grid.Column="1" Grid.Row="0"  Margin="3" 
                      Name="cmbPublication" BorderThickness="1" 
                      ItemsSource="{Binding Path=EnterpriseList}" DisplayMemberPath="Name" 
                      SelectedValuePath="Value" SelectedIndex="0" 
                      IsSynchronizedWithCurrentItem="True" />

            <!-- Distribution Area Region -->
            <TextBlock Name="tbkDistributionArea" Text="{x:Static abConst:Print.tbkDistributionAreaText}" Grid.Row="1" Grid.Column="0" Margin="3" ></TextBlock>
            <ComboBox Grid.Column="1" Grid.Row="1"  Margin="3" 
                      Name="cmbDistributionArea" BorderThickness="1" 
                      ItemsSource="{Binding Path=ZonesList}" 
                      DisplayMemberPath="Name" 
                      SelectedValuePath="Value" SelectedIndex="0" 
                      IsSynchronizedWithCurrentItem="True" />

AND C # (ViewModel)

    #region Properties

    public ObservableCollection<GenericNameValuePair<int, string>> EnterpriseList
    {
        get { return _abEnterpriseList; }
        set { _abEnterpriseList = value; }
    }

    public ObservableCollection<GenericNameValuePair<int, string>> ZonesList
    {
        get { return _abZonesList; }
        set
        {
            _abZonesList = value;
        }
    }

  #endregion


    private void InitCollections()
    {            
        _collectionViewEnterprise = CollectionViewSource.GetDefaultView(EnterpriseList);
        _collectionViewZone = CollectionViewSource.GetDefaultView(ZonesList);

        //Replace
        if(_collectionViewEnterprise == null)
            throw new NullReferenceException("Enterprise collectionView is null.");

        if (_collectionViewZone == null)
            throw new NullReferenceException("Zone collectionView is null.");

        _collectionViewEnterprise.CurrentChanged += new EventHandler(OnCollectionViewEnterpriseCurrentChanged);
        _collectionViewZone.CurrentChanged += new EventHandler(OnCollectionViewZoneCurrentChanged);
    }

Пожалуйста, помогите. Заранее спасибо.

1 Ответ

4 голосов
/ 11 февраля 2010

Вам необходимо связать комбинированный список с представлением коллекции, а не с базовой коллекцией.Ниже приведен рабочий образец:

XAML:

<Window x:Class="CurrentChangedTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <StackPanel>

        <ComboBox 
              ItemsSource="{Binding Path=ZoneCollView}" 
              DisplayMemberPath="Value" 
              SelectedIndex="0" 
              IsSynchronizedWithCurrentItem="True" />

        <TextBlock Text="{Binding Path=ZoneCollView.CurrentItem}" />

    </StackPanel>
</Window>

Код:

using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows;
using System.Windows.Data;

namespace CurrentChangedTest
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            _zoneList.Add(new KeyValuePair<int, string>(0, "zone 0"));
            _zoneList.Add(new KeyValuePair<int, string>(1, "zone 1"));
            _zoneList.Add(new KeyValuePair<int, string>(2, "zone 2"));

            ZoneCollView = new CollectionView(_zoneList);
            ZoneCollView.CurrentChanged +=
                delegate { Debug.WriteLine(ZoneCollView.CurrentItem); };

            DataContext = this;
        }

        public ICollectionView ZoneCollView { get; set; }

        private List<KeyValuePair<int, string>> _zoneList = new List<KeyValuePair<int, string>>();
    }
}
...