2010-02-11 5 views
2

ICollectionView 중 하나에 문제가 있습니다. ICollectionViewCurrentChanged 이벤트가 발생하지 않습니다.WPF ObservableCollection CollectionView.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" /> 

및 C# (뷰 모델은)

#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); 
    } 

도와주세요. 미리 감사드립니다.

답변

4

combobox를 기본 컬렉션이 아닌 collectionview에 databind해야합니다.

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>>(); 
    } 
} 
다음 작업 샘플입니다