2011-01-07 5 views
1

MVVM 패턴을 사용하여 응용 프로그램을 빌드합니다. 이 응용 프로그램에서 내가 선택한 항목을 포함하는 항목의 colletion과 속성에 바인딩 된 콤보 상자가 있습니다WPF : 변경 후 ComboBox 재설정

이 콤보 상자의 항목 컬렉션은 첫 번째와 같은 "명령 텍스트"로 초기화됩니다
<ComboBox ItemsSource="{Binding Path=Persons, Mode=OneTime}" 
      SelectedValue="{Binding Path=SelectedPerson, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

다음 항목과 일반 항목의 무리 :

Persons.Add("Open Person..."); 
Persons.Add("Anders Andersson"); 
Persons.Add("Bengt Bengtsson"); 
Persons.Add("Carl Carlsson"); 
Persons.Add("Daniel Danielsson"); 

나는이 콤보에 대해 갖고 싶은 동작은 처음에 명령 텍스트를 (이것은 물론 쉽게 달성)을 보여줍니다 것입니다. 사용자가 ComboBox에서 사람을 선택하면 응용 프로그램에서 작업을 수행하고 (선택한 사람을 연 다음) 지시 텍스트로 다시 설정합니다. 사용자가 콤보 상자의 명령 텍스트보다 다른 것을 선택하면

private string _selectedPerson = "Open Person..."; 
public string SelectedPerson 
{ 
    get 
    { 
     return _selectedPerson; 
    } 
    set 
    { 
     if (value != _selectedPerson) 
     { 
      OpenPerson(value); 
      OnPropertyChanged("SelectedPerson"); 
     } 
    } 
} 

내 생각은, OpenPerson는()입니다 것을 :

으로 먼저 선택한 항목에 대해이 속성을함으로써이 쉬울 것이라고 생각 선택된 값으로 호출되지만 선택된 값은 개인 필드 (_selectedPerson)에 저장되지 않습니다. 그런 다음 ComboBox가 SelectedPerson 속성의 값을 읽고 자체적으로 (SelectedValue) 업데이트하도록 PropertyChanged 이벤트를 트리거합니다. _seletedPerson 필드는 여전히 지침 텍스트이기 때문에 ComboBox는 그 자체로 재설정됩니다.

이것은 작동하지 않습니다.

실제로 모든 것이 예상대로 발생했습니다. rightPerson()이 right 매개 변수와 함께 호출 된 다음 PropertyChanged 이벤트가 트리거됩니다. 그러나 ComboBox에 표시된 값을 변경하는 GUI의 동작은 실제로이 후에 수행됩니다. 즉, 내가 SelectedPerson을 설정하면 ComboBox는 GUI에서 선택된 항목을 표시합니다.

이 문제를 해결할 수있는 우아한 방법이 있습니까?

실제로, 나는이 문제를 해결했습니다. 그러나 CodeBehind의 코드, ViewModel의 두 플래그 및 SelectedPerson 속성의 불쾌한 코드가 관련되어있었습니다. 해결책은, 잘, 최소한을 말하는 만족스럽지 않습니다 ...;) 그래서, 나보다 똑똑한 사람이 더 나은 해결책을 찾을 수 있기를 바랐습니다! :)

답변

1

Combobox 용 SelectionChanged 처리기를 만들고 대신 "Open Person ..."으로 변경해 보았습니까?

또는 심지어 인덱스를 0으로 설정하는 콤보 상자의 트리거일까요?

+0

물론! SelectionChanged 핸들러를 사용하는 것이 가장 간단한 솔루션입니다. ViewModel에서이 작업을 수행하는 방법에 대해 생각하고있었습니다. 물론, 내 코드에서 코드가 필요 없도록 위의 솔루션이 작동한다면 더 좋겠지 만 명백하게는 그렇지 않습니다. 감사합니다 잉고! :) – haagel

0

방금 ​​찾은이 제품은 다른 것을 찾고 있습니다.

명령을 Selectchanged 이벤트에 바인드합니다.이 명령은 Viewmodel에 정의되어 MVVM 패턴 (뒤에 코드 없음)을 따릅니다. 당신이 혼합 상호 작용 참조가 포함 된 다음 포함 할 필요가 있으므로

은 내가 MVVM 라이트 프레임 워크를 사용

  <ComboBox Name="idClient" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="2" 
           Style="{StaticResource FTC_DetailComboBox}" 
           ItemsSource="{Binding ClientViewSource.View}" 
           SelectedItem="{Binding client}" 
           SelectedValuePath="idClient" 
           SelectedValue="{Binding idClient, Mode=TwoWay, ValidatesOnDataErrors=True}" 
           DisplayMemberPath="chrCompany" 
           > 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="SelectionChanged"> 
         <cmd:EventToCommand Command="{Binding LostFocusValidateCommand}" CommandParameter="idStatus"/> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 
      </ComboBox> 

:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
xmlns:cmd="http://www.galasoft.ch/mvvmlight" 

을 내 XAML에서 선언하는 방법입니다 다음 여기 내 viewmodel (vb.net)에서 코드입니다.RelayCommand는 ICommand의 간단한 구현입니다

Private _LostFocusValidateCommand As RelayCommand(Of String) 

    Public ReadOnly Property LostFocusValidateCommand() As RelayCommand(Of String) 
     Get 
      If _LostFocusValidateCommand Is Nothing Then 
       _LostFocusValidateCommand = New RelayCommand(Of String)(AddressOf LostFocusValidateExecute) 
      End If 
      Return _LostFocusValidateCommand 
     End Get 
    End Property 

    Private Sub LostFocusValidateExecute(sParam As String) 
     ''perform commands here 
    End Sub