2013-05-22 2 views
0

부모와 자식의 두 창이 있습니다. 상위 창에는 목록 상자가 있습니다.MVVM에서 ICommand를 사용하여 데이터 변경

MAINVIEW : 나는 매개 변수를 사용하여 ICommand의를 사용하여 선택된 사람 양방향 업데이트를 변경하기 위해 노력하고있어

<Button x:Name="btnUpdate" Content="Update" 
       Command="{Binding Path=MyCommand}" CommandParameter="{Binding ElementName=lstPerson, Path=SelectedItem}" /> 

<ListBox x:Name="lstPerson" ItemsSource="{Binding Persons}" /> 

.

PersonViewModel는 :

 private ICommand myCommand; 
     public ICommand MyCommand 
     { 
      get 
      { 
       if (myCommand == null) 
       { 
        myCommand = new RelayCommand<object>(CommandExecute, CanCommandExecute); 
       } 

       return myCommand; 

      } 

     } 

     private void CommandExecute(object parameter) 
     { 

      var ew = new EditWindow() 
         { 
          DataContext = 
           new EditViewModel() 
            { 
             Name = ((Person) parameter).Name, 
             Address = ((Person) parameter).Address 
            } 
         }; 

      ew.Show(); 

     } 

그러나 사람의 선택된 인스턴스 목록 상자에서 변경되지 않습니다. xaml 또는 PersonViewModel에 쓰기 작업을하려면 무엇이 필요합니까?

P.

다음은 명령에 대한 exceution 명령의 매개 변수가 잘못 내 사람

public class Person : INotifyPropertyChanged 
    { 
     private string name; 
     private string address; 

     public event PropertyChangedEventHandler PropertyChanged; 
     public void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     public string Name 
     { 
      get 
      { 
       return name; 
      } 
      set 
      { 
       name = value; 
       OnPropertyChanged("Name"); 
      } 
     } 
     public string Address 
     { 
      get 
      { 
       return address; 
      } 
      set 
      { 
       address = value; 
       OnPropertyChanged("Address"); 
      } 
     } 
    } 

답변

2

입니다. ObservableCollection<PersonViewModel>에 바인딩 된 목록의 SelectedItem에 바인딩하면 선택한 항목의 유형은 PersonViewModel입니다. 그에 따라 ICommand as RelayCommand and modify CommandExecute (PersonViewModel person)`초기화를 시도하십시오.

두 번째로 ICommand는 PersonViewModel에 정의되어 있지만 명령은 Persons 컬렉션을 보유하고있는 ViewModel에 있어야합니다. 따라서 Command를 이동하거나 특정 ViewModel을 수정하는 방식으로 PersonViewModel에서 명령을 정의하면 켜져 있습니다. 당신이 CommandParameter을 아끼지하지만,이 같은 명령을 결합 할 수있는 것보다 :

CommandExecute이 같은합니다

private void CommandExecute(object parameter) 
{ 
    // Modify this, ie. this.Name = something 
} 

마지막 일을, 당신의 ViewModel도에서 INotifyPropertyChanged를 구현하고 전달해야 모델 변경 알림. 그렇지 않으면 실제 속성에 대한 바인딩이 업데이트를 변경하지 않는 한 변경 사항이 반영되지 않습니다. 예를 들어이

<TextBox Text="{Binding Name, Mode=TwoWay}" /> 

같이 결합되면, 뷰 모델에 Name 속성이 업데이트됩니다,하지만 당신은 당신의 CommandExecute(..) 방법에

Name = "ChuckNorris" 

를 호출 할 경우 UI가 있기 때문에, 업데이트되지 않습니다 변경 통지는 발사되지 않습니다.

+0

나는 그것을한다! MainWindow.xaml에서 1. 추가 : : 2 PersonViewModel에서에서 INotifyPropertyChanged를 구현 3. 추가 한 <리스트 박스 X 이름 = "lstPerson는"ItemsSource = selectedItem가 =이/{SelectedPerson 바인딩} "{사람 바인딩}">을 속성 SelectedPerson. 감사합니다. –

+0

니스, 작동합니까? – Marc

관련 문제