2012-09-25 4 views
-1

ListView은 각 항목이 읽기 전용 (예 : 선택 제외, TextBox)이 아닌 ComboBox (ItemTemplate 기준)으로 표시되는 것으로 정의했습니다.링크 목록 항목을 개별적으로 다른 목록에 표시

각 콤보 상자에서 선택할 수있는 가능한 항목 목록이 있습니다. 그러나주의해야 할 점은 한 번에 두 개의 콤보 상자에서 항목을 선택할 수 없다는 것입니다. 이를 보장하기 위해 콤보 상자 중 하나에서 항목을 선택하면 다른 콤보 상자에서 모두 제거해야합니다 (선택되어있는 항목을 제외하고 분명히 선택 항목). 일단 선택이 해제되면 추가해야합니다 다른 모든 콤보 상자에 다시 연결하십시오.

아, 한 가지 더 : 보이는 항목의 순서는 전체 목록과 비교해서 변경해서는 안됩니다.

내 질문 : 이 동작을 어떻게 수행 할 수 있습니까?

내가 내 마음에 온 세 가지 솔루션을 시도

: 나는 기존 항목의 전체 목록 및 제외 (사용) 항목의 목록을 통해 소요 새로운 도우미 컨트롤 클래스를 작성했습니다

  • 을 외부 세계에 대한 바인딩 및 선택한 항목에 대한 속성이 포함됩니다. ItemTemplate에 해당 컨트롤 클래스를 포함 할 수 있습니다. 해당 템플릿 내의 콤보 상자는 ItemsSource 속성을 기존 항목의 목록, 제외 된 항목의 목록 및 선택한 항목을 함께 묶어 놓은 것으로 예상되는 도우미 클래스의 ItemsProvider 속성에 바인딩하고 그 항목에 대한 단일 열거를 반환합니다 특정 콤보 상자.
    그러나 목록 변경 사항에 대한 모든 업데이트 알림이 어떻게 든 사라졌습니다. 두 개의 입력 목록 중 NotifyCollectionChangedAction의 모든 조합에 개별적으로 반응해야한다는 점과 두 가지 업데이트 방법이있을 것이라는 전망과 함께 이것이 올바른 방법이 될 수 없다고 생각합니다.
  • 기존 항목의 목록을 각 항목과 함께 부울을 저장하는 목록으로 변경하여 각 항목을 숨김으로 플래그를 지정할 수 있습니다. 이렇게하면 항목 순서를 유지하면서 제외 된 항목의 목록을 가져와 결합 된 변경 알림의 앞에서 설명한 복잡성을 줄여야 할 필요성이 줄어 듭니다.
    불행히도 목록 자체가 해당 솔루션으로 변경되지 않기 때문에 종속성 속성 인프라가 내 도우미 클래스의 내 ItemsSource 속성을 알리는 방법을 모르겠습니다.
  • 나는 에 바인딩 방법으로 WPF를 사용해야합니다. 나는 여기서도 코드 숨김을 할 수있다. 그래서, 나는 모든 ListViewItem s를 반복하고 각각의 콤보 상자를 검색하여 수동으로 항목 목록을 새로 고쳤습니다. 그러나 항목 템플릿을로드 한 후 ListViewItem에 액세스 할 수있는 좋은 시간을 찾지 못했습니다. 이 상황에 대한 이벤트가없는 것 같습니다. 따라서 이 봉인 된 클래스가 아니더라도 OnApplyTemplate을 무시할 수있는 사용자 지정 목록보기 항목을 만들 수있는 ItemContainerGenerator을 할당 할 수 없습니다. .
+0

이 전에 요청 된 , 그것을 발견하는 것이 도전이 될지라도 .. –

+0

@ H.B .: 가능합니다. 만약 내가 비슷한 질문을 답으로 찾았 으면 다른 사람들도 비슷한 문제에 직면 했음에도 불구하고 나는 묻지 않았을 것입니다. –

+0

downvote 이유는 무엇입니까? –

답변

0

아마 모든 ComboBoxesCollectionViews 다른 어떤 필터 밖으로 다른 ComboBoxes의 선택한 항목을 소스 모음을 통해 결합하는 것이다. 콤보 상자의 선택 항목이 변경되면보기가 Refresh이어야합니다.

+0

'CollectionView'는 나를위한 누락 된 링크였습니다. 나는 ListCollectionView로 관리했다. –

0

목록을 ViewModel의 다른 목록에 바인딩하고 선택한 항목을 바인드하여 해당 목록을 변경하는 방법을 트리거하면 결과를 얻을 수 있습니다. 아래와 비슷합니다. MainWindow.xaml의

XAML :

코드 숨김 MainWindow.xaml에 대한
<Window x:Class="ComboBox.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" > 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="180" /> 
      <ColumnDefinition Width="180" /> 
      <ColumnDefinition Width="180" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="26" /> 
     </Grid.RowDefinitions> 
     <ComboBox Name="cboOne" Grid.Column="0" Grid.Row="0" ItemsSource="{Binding CboOneList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValue="{Binding CboOneValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></ComboBox> 
     <ComboBox Name="cboTwo" Grid.Column="1" Grid.Row="0" ItemsSource="{Binding CboTwoList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValue="{Binding CboTwoValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></ComboBox> 
     <ComboBox Name="cboThree" Grid.Column="2" Grid.Row="0" ItemsSource="{Binding CboThreeList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValue="{Binding CboThreeValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></ComboBox> 
    </Grid> 
</Window> 

:

using System.Windows; 
using System.Windows.Controls; 

namespace ComboBox { 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window { 
    public MainWindow() { 
     InitializeComponent(); 

     this.DataContext = new ComboBoxViewModel(); 

    } 

    private void cboOne_SelectionChanged(object sender, SelectionChangedEventArgs e) { 

    } 
} 
} 

뷰 모델 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ComponentModel; 

namespace ComboBox { 
class ComboBoxViewModel : INotifyPropertyChanged { 
    public event PropertyChangedEventHandler PropertyChanged; 
    List<string> master = new List<string>() { "A", "B", "C", "D", "E", "F" }; 

    #region C'tor 
    public ComboBoxViewModel() { 
     RetrieveLists(); 
    } 
    #endregion 

    #region Methods 
    protected void OnPropertyChanged(String propertyName) { 
     PropertyChangedEventHandler handler = this.PropertyChanged; 
     if(null != handler) { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public void RetrieveLists() { 
     List<string> tempOne = (from a in master 
           where !a.Equals(CboTwoValue) && !a.Equals(CboThreeValue) 
           select a).ToList(); 
     CboOneList = tempOne; 

     List<string> tempTwo = (from a in master 
           where !a.Equals(CboOneValue) && !a.Equals(CboThreeValue) 
           select a).ToList(); 
     CboTwoList = tempTwo; 

     List<string> tempThree = (from a in master 
           where !a.Equals(CboTwoValue) && !a.Equals(CboOneValue) 
           select a).ToList(); 
     CboThreeList = tempThree; 
    } 
    #endregion 

    #region Properties 
    private string cboOneValue = string.Empty; 
    public string CboOneValue { 
     get { 
      return cboOneValue; 
     } 
     set { 
      if(!value.Equals(cboOneValue)) { 
       cboOneValue = value; 
       RetrieveLists(); 
       OnPropertyChanged("CboOneValue"); 
      } 
     } 
    } 
    private string cboTwoValue = string.Empty; 
    public string CboTwoValue { 
     get { 
      return cboTwoValue; 
     } 
     set { 
      if(!value.Equals(cboTwoValue)) { 
       cboTwoValue = value; 
       RetrieveLists(); 
       OnPropertyChanged("CboTwoValue"); 
      } 
     } 
    } 
    private string cboThreeValue = string.Empty; 
    public string CboThreeValue { 
     get { 
      return cboThreeValue; 
     } 
     set { 
      if(!value.Equals(cboThreeValue)) { 
       cboThreeValue = value; 
       RetrieveLists(); 
       OnPropertyChanged("CboThreeValue"); 
      } 
     } 
    } 

    private List<string> cboOneList = new List<string>(); 
    public List<string> CboOneList { 
     get { 
      return cboOneList; 
     } 
     set { 
      cboOneList = value; 
      OnPropertyChanged("CboOneList"); 
     } 
    } 

    private List<string> cboTwoList = new List<string>(); 
    public List<string> CboTwoList { 
     get { 
      return cboTwoList; 
     } 
     set { 
      cboTwoList = value; 
      OnPropertyChanged("CboTwoList"); 
     } 
    } 

    private List<string> cboThreeList = new List<string>(); 
    public List<string> CboThreeList { 
     get { 
      return cboThreeList; 
     } 
     set { 
      cboThreeList = value; 
      OnPropertyChanged("CboThreeList"); 
     } 
    } 
    #endregion 
} 

}

관련 문제