2017-09-19 2 views
1

MVVM을 배우기위한 응용 프로그램을 개발 중입니다. 나는 지금 문제가있다. 그러나 나는 나의 것과 비슷한 사건을 발견 할 수 없었다.WPF ComboBoxItem 스타일은 Combobox가 포커스를 얻은 후에로드됩니다.

먼저 내 코드 :

  • 재산권 : 문자열 이름
  • 재산권 : 부울에 isSelected
나는 다음과 같이 구성되어 간단한 개체의 목록을 가지고

<ComboBox Width="100" DisplayMemberPath="Name" ItemsSource="{Binding MyList}"> 
    <ComboBox.Resources> 
    <Style TargetType="ComboBoxItem"> 
     <Setter Property="IsSelected" Value="{Binding IsSelected}"/> 
    </Style> 
    </ComboBox.Resources> 
</ComboBox> 

이 개체 목록을 내 ComboBox에 바인딩하고 IsSelected - 내 개체의 속성은 IsSelected - ComboBoxItem의 속성 바인딩이 잘 작동하고, 객체가 ComboBox에 있고 항목을 선택하면 IsSelected - 속성이 업데이트됩니다.

하지만 문제는 응용 프로그램이 시작될 때 선택 항목이 표시되지 않는다는 것입니다. 선택한 항목이 보이도록 ComboBox을 클릭해야합니다. 나는 그 부모가 초점을 얻은 후 ComboBoxItem의 스타일이로드 된 것으로 생각합니다.

해결책이 있습니까?

+0

문제 확인, 콤보 상자 항목 UI는 팝업 목록이 실제로 열릴 때만 구성됩니다. 따라서 개봉하기 전에는 항목 기반 스타일이 적용되지 않습니다. 아마도'SelectedItem' /'SelectedValue'를 사용해야 할 것입니다. – grek40

+0

감사합니다, grek! 이제 IsSelected가 true 인 객체를 반환하는 새로운 readonly 속성이 있습니다. 그리고 Combobox의 SelectedItem을이 새 속성 (Mode = OneTime)에 바인딩했습니다. 이제 작동합니다. 하지만이 방법은 불필요한 추가 속성이 필요한 해결 방법이라고 생각합니다. 따라서 누군가가 주요 문제를 해결할 수있는 해결책을 찾을 수 있다면 행복 할 것입니다. –

+0

나는 combobox'Loaded' 이벤트와 같이 더 많은 대안을 제공 할 수 있습니다 : open, update and close :'cb1.IsDropDownOpen = true; cb1.UpdateLayout(); cb1.IsDropDownOpen = false;'그러나 선택된 항목/값을 사용하면 해결 방법이 줄어들고 표준 접근 방식이 향상됩니다. IsSelected 접근법은 단일 선택보다 다중 선택 시나리오에 더 적합합니다. – grek40

답변

0

설정하거나 항목의 인스턴스에 ComboBoxSelectedItem 속성을 결합해야 선택한다 :

<ComboBox Width="100" DisplayMemberPath="Name" ItemsSource="{Binding MyList}" SelectedItem="{Binding Selected}"> 
... 

Selected = MyList.FirstOrDefault(x => x.IsSelected == true); 

이것은 당신이 MVVM을 사용하여 ComboBox에서 항목을 선택하는 방법이다 . ComboBoxItem 스타일을 정의하지 마십시오.

+0

이것은 어제 @ grek40 도움으로 해결 한 방법입니다. 그러나 나는 "FirstOrDefault"라는 아주 좋은 방법을 모르고있었습니다. 감사합니다! :) –

관련 문제