2011-03-30 6 views
0

이 내가이 뷰 모델의 수집에 XamDataPresenter (XamDataGrid)를 구속했다 :WPF Caliburn : 컬렉션 항목의 값이 변경 될 때 인식

의 의

의 XAML :

<igDP:XamDataPresenter x:Name="dataPresenter" DataSource="{Binding Path=AppServers, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True"> 
</igDP:XamDataPresenter> 

코드 :

public ShellViewModel() 
    { 
     AppServers = new BindingListCollectionView(new BindingList<AppServer>(_context.GetAllAppServers())); 

     AppServers.CurrentChanged += new EventHandler(AppServers_CurrentChanged); 
    } 

    void AppServers_CurrentChanged(object sender, EventArgs e) 
    { 
     NotifyOfPropertyChange(() => CanSaveAppServers); 
     NotifyOfPropertyChange(() => CanDeleteAppServers); 
    } 

CanSaveAppServers 속성 :

public bool CanSaveAppServers 
    { 
     get 
     { 
      return (_appServers.SourceCollection as BindingList<AppServer>).Any(x => x.ChangeTracker.State != ObjectState.Unchanged); 
     } 
    } 

컬렉션의 항목이 변경되면 CanSaveAppServers 속성이 false 여야합니다. 그러나 CanSaveAppServers는 어떻게 호출됩니까? 다른 이벤트? 또는 잘못된 컬렉션 유형? 어떤 방식 으로든 자동으로이 작업을 수행해서는 안됩니까?

미리 감사드립니다.

답변

0

Caliburn이 명명 규칙을 통해 바인딩하게하려면 SaveAppServers이라는 공용 메서드가 있어야합니다. 버튼을 클릭하면 ICommandExecute()이 호출되도록에 바인딩 된 ICommand이 생성됩니다. 그 동안 ICommand에있는 CanExecute() 메서드는 단추 사용 여부를 결정하는 데 사용됩니다.

당신이 NotifyOfPropertyChange(() => CanSaveAppServers) 전화

이는 ICommand가 WPF는 내부적으로 CanSaveAppServers을 받고있는, 다시 CanExecute()를 호출하여 새로 만드는 그 CanExecuteChanged 이벤트를 마련하게 끝납니다.

관련 문제