2012-08-24 2 views
1

ListBox에서 항목을 선택하려면 두 번 클릭해야합니다. 이 선택된 항목은 항상 굵게 표시되어야합니다. SelectedItem 속성은 내가 선택한 항목으로 취급하고있는 항목을 더 이상 반영하지 않기 때문에 이전에 선택한 항목을 굵게 표시하는 데 사용했던 아래의 XAML이 더 이상 작동하지 않습니다.MVVM - 더블 클릭으로 ListBox에서 항목을 선택하고 굵게 표시

<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" Value="True"> 
       <Setter Property="FontWeight" Value="Bold"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ListBox.ItemContainerStyle> 

은 내가 MVVM과 더블 클릭을 처리하는과 뒤에와 MouseDoubleClick 이벤트 코드를 사용하여 확인이라고 결론을 내렸다 방법으로 보았다.

private void lbProfiles_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    _viewModel.SelectedProfile = ((ListBox)sender.)SelectedItem as MyProfile; 
    //What should go here? 
} 

내보기 모델은 내가 위의 방법으로 설정됩니다 생각 SelectedProfile 속성이 있습니다. 어쨌든 SelectedProfile을 XAML에 바인딩 할 것인지, 아니면 코드에서 관리해야합니까? 또한이 항목을 굵게 표시하는 가장 좋은 방법은 무엇입니까?


편집 1 :

나는 항목이 강조하지만 선택하지 않은 클릭 하나에 있도록 조금 레이첼의 대답을 조정 끝났다. 그런 식으로 뷰 모델은 SelectedItem 속성과 HighlightedItem 속성을 가질 수 있습니다.

private void ListBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.ClickCount < 2) 
     e.Handled = true; 

    var clickedItem = ((ContentPresenter)e.Source).Content as MyProfile; 

    if (clickedItem != null) 
    { 
     //Let view model know a new item was clicked but not selected. 
     _modelView.HighlightedProfile = clickedItem; 

     foreach (var item in lbProfiles.Items) 
     { 
      ListBoxItem lbi = 
       lbProfiles.ItemContainerGenerator.ContainerFromItem(item) as ListBoxItem; 

      //If item is not displayed on screen it may not have been created yet. 
      if (lbi != null) 
      { 
       if (item == clickedItem) 
       { 
        lbi.Background = SystemColors.ControlLightBrush; 
       } 
       else 
       { 

        lbi.Background = lbProfiles.Background; 
       } 
      } 
     } 
    } 
} 

답변

3

DoubleClick에서 항목을 선택하는 가장 쉬운 방법은 오직 ClickCount 미만 2

이것은 또한으로 텍스트를 설정하여 Trigger을 유지하는 것을 허용 할 경우 Handled으로 클릭 이벤트를 표시하는 것입니다 이

<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <EventSetter Event="PreviewMouseDown" Handler="ListBoxItem_PreviewMouseDown" /> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" Value="True"> 
       <Setter Property="FontWeight" Value="Bold" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ListBox.ItemContainerStyle> 


private void ListBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.ClickCount < 2) 
     e.Handled = true; 
} 

을 선택할 때 Bold 그냥이가 ListBoxItem의 모든 단 한번의 클릭 이벤트를 비활성화 있음을 유의하십시오. 한 번 클릭 이벤트를 허용하려면 PreviewMouseDown 이벤트를 조정하여 특정 클릭을 Handled으로 표시해야합니다.

관련 문제