2012-03-26 3 views
0

ObservableCollection에 바인딩 된 ListBox가 있습니다.ListBoxItem on MouseLeftButtonUp

마우스를 놓을 때 ListBoxItem을 선택하고 (MouseLeftButtonUp을 의미 함) 선택 영역을 전환해야합니다. ListBoxItem을 선택하면 항목을 다시 선택하면 항목의 선택이 취소되고 반대의 경우도 마찬가지입니다.

ListBoxItem을 선택하면 다른 스타일도 적용해야합니다.

나는 다음과 같이 시도했다.

ListBoxItem에 DataTemplate 및 Style을 사용하고 EventSetter에서 MouseLeftButtonUp에 대한 이벤트를 구독했으며 이벤트 처리기에서 항목을 선택하고 전환하는 중입니다.

문제는 항목을 선택 (Ctrl + 화살표 키, Shift + 화살표 키, 화살표 키, Ctrl + A)하고 선택 스타일을 적용하는 여러 가지 방법이 있다는 것입니다.

'Name'속성을 사용하여 DataTemplate의 데이터 바인딩의 다른 용도로 이미 사용 된 ListBoxItem (Tag 속성)의 이전 상태를 저장했습니다.

어떻게 해결할 수 있습니까?

어떤 아이디어라도 대단히 감사하겠습니다.

답변

0

내가 먼저 제안하는 것은 MouseLeftButtonUp을 사용하는 것을 잊어 버리고 컨트롤의 SelectedItem을 코드의 변수에 바인딩하는 것입니다. 그렇게하면 사용자가 키보드를 사용하기로 결정하면 모든 것이 트랩됩니다.

<ListBox x:Name="lbItems" ItemsSource="{Binding Path=MyListItems}" SelectedItem="{Binding Path=SelectedItem, Mode=TwoWay}"/> 

public ObservableCollection<YourClass> MyListItems 
public YourClass SelectedItem 

사용자가 항목을 선택하자 마자 SelectedItem이 자동으로 설정됩니다.

그런 다음 다시 클릭하면 항목을 선택 취소해야합니까? 표준 동작이 아니므로 항목을 선택 취소해야합니까? 당신이 이전에 선택한 항목을 기록 할 경우

, 당신은 당신이 때의 selectedItem 변경을 설정

private YourClass _previousSelectedItem; 

private YourClass _selectedItem; 
public YourClass SelectedItem 
    { 
    get { return _selectedItem;} 
    set { if (_selectedItem == value) return; 
      _previousSelectedItem = _selectedItem; 
      _selectedItem = value; 
     } 
    } 

있을 수 있습니다.

몇 가지 아이디어가 있습니까?