2011-07-05 2 views
4

wpf 응용 프로그램에 다음 xaml이 있습니다. 보기 모델에서 단추를 ICommand에 바인딩하고 싶습니다. 웬일인지, 나는 나의 시야에서 명령을 볼 수 없다. 이것은 사용자 정의 컨트롤입니다. 내 ICommand의 객체가 여기버튼을 클릭 할 때 wpf 명령이 실행되지 않음

<Grid> 
<Grid.DataContext> 
     <Binding 
      x:Name="SettingsData" 
      Path="Data" /> 
    </Grid.DataContext> 
. 
. 
. 
<DockPanel Grid.Column="1"> 
      <Button x:Name="SaveButton" 
        DockPanel.Dock="Top" 
        Height="25" 
        HorizontalAlignment="Left" 
        Margin="70 0 0 0" 
        Command="{Binding Path=SaveData}" 

        >Save Changes</Button> 
     </DockPanel> 
</Grid> 

입니다 -

public ICommand SaveData 
     { 
      get 
      { 
       if (_saveData == null) 
       { 
        _saveData = new RelayCommand(
         param => this.saveData(), 
         param => true 
         ); 
       } 
       return _saveData ; 
      } 
     } 

사람이 내가이 명령에 결합 할 수없는 이유 어떤 생각을 가지고 있습니까?

I see this in the output window - BindingExpression path error: 'SaveData' property not found on 'object' ''List`1'

이 경우 바인딩의 소스 속성을 무시하십시오 DockPanel에 당신의 DataContext이 목록의 일종에 바인딩과 같은 오류가 아래를 보면

는 어떤 생각에 대한

감사합니다 ....

+0

RelayCommand 구현은 표준 WPF 라이브러리에 속하지 않으므로 어떻게해야합니까? 나는 CanExecute가 false를 반환한다고 생각합니다. –

+0

Josh Smith의 MVVM 튜토리얼 (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx)에서 제공하는 relaycommand 구현을 사용하고 있습니다. 두 번째 매개 변수는 CanExecute이므로 항상 true로 전송됩니다 .... – czuroski

+0

디버깅하는 동안 VS 출력 창의 바인딩 오류를 볼 수 있습니까? – svick

답변

10

Grid의 DataContext를 ViewModel (또는 개체)의 Data 속성으로 설정하는 것처럼 보입니다. Data 속성이 노출하는 개체가 SaveData 명령을 제공하지 않으면 설명하는 것과 같은 문제가 발생합니다. DataContext는 부모로부터 상속 된 것을 기억하십시오.

DataContext가 그런 방식으로 설정되어 있고 부모 DataContext를 참조하도록 단추가 필요하면 RelativeSource를 사용하여 ViewModel이 DataContext 인 요소를 가리키는 옵션이 있습니다.

WPF에서는 이러한 명령을 정적으로 설정하고 {x : Static} 태그 확장을 사용하여 도달 할 수 있습니다.

희망이 있습니다.

수정 : 이 <UserControl>에 포함 된 경우의 예입니다.

<Button Command="{Binding Path=DataContext.SaveData, 
           RelativeSource={RelativeSource Mode=FindAncestor, 
               AncestorType={x:Type UserControl}}}" ... /> 

또한, 나는 전체 XAML 어떻게 생겼는지 모르겠지만,이 그리드에서의 DataContext를 제거하고 ItemsControl에에 데이터 바인딩 (또는 당신이 무엇을 사용하여 크게 간소화 할 수 있다는 생각 개체 목록을 표시).

+0

savedata 명령은 그리드가 바인딩 된 것과 동일한 뷰 모델에 있습니다. 그것을 볼 수 있어야하지 않습니까? – czuroski

+0

아니요, Button의 DataContext는 ViewModel이 아닌 ViewModel.Data입니다. 따라서 ViewModel.Data.SaveData에 바인딩하려고합니다. (그리고 당신의 오류에서 그것은 데이터가 어떤 객체의리스트 인 것처럼 보입니다). – SergioL

+0

그래서 단추의 datacontext를 viewmodel로 설정해야합니까? – czuroski

0

보인다 DataContext가 최상위 수준이 아님

+0

소스를 viewmodel의 이름으로 설정해야합니까? – czuroski

+0

나는 대개 코드 뒤에 DataContext를 설정합니다. 어떻게 View의 DataContext를 설정합니까? –

+0

위 그림과 같이 그리드 레벨의 뷰 xaml에 설정합니다. – czuroski

관련 문제