2010-06-17 9 views
1

날 의사 코드로이 질문을 물어 보자 : ItemTemplate CheckBox의 Command 속성을 ViewModel 개체의 속성에 바인딩하는 방법은 무엇입니까?

<Window> <ListView ItemsSource="{Binding PersonCollection}"> <ListView.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding Path=Name}" /> <TextBlock Text="{Binding Path=Age}" /> <TextBlock Text="/" /> <CheckBox Command="{Binding PersonSelectedCommand}" /> <!-- Where "PersonSelectedCommand" is a public command property available in ViewModel object (lets say "Contacts" in this context)--> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> </Window>

경우
"연락처"윈도우의 DataContext를로 설정 한 뷰 모델 객체입니다.

"연락처"에는 공용 ICommand PersonSelectedCommand 속성 인 "PersonCollection"이 있습니다. "PersonCollection은"목록
입니다
"사람"이름,

현재이 확인란대로 작동하지 않는 시대의 특성이하는 ICommand의 "PersonSelectedCommand" "사람"개체의 속성을 발견하고 결합하려고있다 존재하지 않는다!

어떻게 당신이보기 모델을 변경할 수

덕분에 ICommand의 "PersonSelectedCommand"속성 개체의 "연락처"확인란을 결합하고
123Deveopler

+0

보기 모델 코드를 추가하십시오. – SeeSharp

답변

6

을하지만 직접 귀하의 질문에 대답하기 위해, 당신이해야 할 모든 당신의 CheckBox의 명령에 바인딩을 변경할 수 있습니다 :

Command="{Binding DataContext.PersonSelectedCommand, 
        RelativeSource={RelativeSource FindAncestor,ListView,1}}" 

이 SeeSharp의 대답 바람직하다시에만 단순히 IsSelected 속성을 바인딩하는 것보다 더 많은 통제가 필요합니다. 그렇지 않으면 바인딩 IsSelected로 이동하십시오.

+0

이것은 내가 찾고 있었던 것이다. 내 CheckBox에는 이미 IsSelected 속성에 대한 바인딩이 있습니다 (이 질문에서 언급하지 않았습니다). 그리고 당신이 말했듯이 더 많은 통제가 필요합니다. 감사합니다. – 123Developer

1

간주됩니다? bool 속성 IsSelected를 Person에 추가하면 더 좋을 것이라고 생각합니다. 그리고 체크 박스에 바인딩하십시오 :

<CheckBox IsChecked="{Binding IsSelected}"/> 

명령이 필요하지 않으며 속성 IsSelected의 설정자에 일부 기능을 추가 할 수 있습니다.

+0

좋은 답변 (+1). ViewModel을 변경하지 않고 어떻게 할 수 있는지에 대한 내 대답도 참조하십시오. –

0

PersonSelectedCommand은 사람 범위에 있어야합니다. 따라서 사용자 목록에 바인딩 할 때 명령 목록을 갖게됩니다. 그러므로 사람이 선택 될 때마다 해당 명령을 실행해야합니다.

그렇지 않으면 조상에서 RelativeSource를 사용하여 조상을 찾아서 그런 식으로 PersonSelectedCommand를 설정할 수 있습니다. 이 답변 확인 : 나는 SeeSharp의 답변을 좋아 Is there a simple way to specify a WPF databinding where the path is one "level" up?

관련 문제