2009-06-29 6 views
2

ListBox를 DiceViewModel의 관측 가능한 컬렉션에 바인딩했습니다. 새 항목을 추가하기 위해 단추를 클릭 할 때마다 ListBox에 새 항목이 표시됩니다. 지금까지 모든 것이 잘 작동합니다.ListBox 내의 항목 업데이트

<ListBox 
    ItemsSource="{Binding Path=AllDice}" 
    DisplayMemberPath="Value"/> 

그러나 기존의 모든 주사위를 굴릴 수있는 버튼이 있습니다. 이미 상자에 나열된 항목은 업데이트되지 않으며 MVVM 디자인 패턴을 유지하면서이를 시행하는 방법을 잘 모르겠습니다.

또한 내 DiceViewModel은 이미 INotifyPropertyChanged를 구현합니다.

제안 사항?

답변

4

좀 더 파고 들어가면, 내가 찾은 것이 있습니다. ObservableCollection은 자동으로 DiceViewModel의 INotifyPropertyChanged 이벤트에 등록되지 않습니다. 따라서 모든 속성 변경 사항이 처리되지 않습니다.

내 창 요소에이 네임 스페이스 정의를 추가 :

그러나, XAML 파일에서 할 수있는 방법이있다. 그 사건 후 불을받을 지정된 데이터 형식의 ObservableCollection에, 내 컬렉션 항목에 자신을 등록 할 수와

<ListBox ItemsSource="{Binding Path=AllDice}"> 
    <ListBox.Resources> 
    <DataTemplate DataType="{x:Type vm:DiceViewModel}"> 
     <TextBlock Text="{Binding Path=Value}"/> 
    </DataTemplate> 
    </ListBox.Resources> 
</ListBox> 

:

xmlns:vm="clr-namespace:Rolling.ViewModel" 

은 그 때 나는 지정된 데이터 형식으로 DataTemplate을를 사용하는 내 목록 상자를 수정 그것은 자신의 CollectionChanged 이벤트입니다.

이 기능이 제대로 설명되지 않은 다른 사람들에게 도움이되기를 바랍니다.

+2

이것은 아마도 기본 템플릿이 ToString을 사용하고 변경 사항에 대해 ToString을 메서드로 볼 수 없기 때문일 수 있습니다. 좋은 픽업. –

+0

알다시피, 나는 돌아가서 실험을했다. 나는 모든 DataTemplate 항목을 제거하고 원래의 간단한 코드로 되돌 렸습니다. 그리고 여전히 작동합니다. 왜 처음에는 실패했는지 모르겠습니다. 검색하는 동안 어딘가에 실수로 원래의 문제를 해결했으며이 게시물의 내용이이를 수정했다고 생각했습니다. –

0

항목이 바인딩 된 컬렉션에 INotifyCollectionChanged 인터페이스를 구현 한 다음 컬렉션이 변경되었음을 나타 내기 위해 CollectionChanged 이벤트를 발생시켜야합니다.

전체 목록이 새로 고침됩니다.

+0

음, 내가 사용하고있는 ObservableCollection은 INotifyCollectionChanged를 구현하고 ListBox는 항목을 추가 할 때 새 항목을 추가하지만 원본 항목 데이터의 내용을 표시 할 때는 표시된 값을 업데이트하지 않습니다. –

0

ObservableCollection의 경우 INotifyPropertyChanged는 컬렉션 구조의 변경 사항에 대해서만 알립니다. 일반적으로 항목 추가 및 제거입니다. 컬렉션에는 컬렉션 내의 개별 항목의 속성 변경 사항에 대한 지식이 없습니다. 그 대신 개별 항목 자체가 속성 변경 알림을 전송할 책임이 있습니다.

이러한 추론은 학급 책임과 관심사의 분리로 이어집니다. DiceViewModel은 다이 관련 정보와 마지막 롤의 값을 가질 가능성이 크므로, 자신의 속성이 변경 될 때 알림을 보내 게됩니다.