문제

이것은 상당히 복잡합니다. 누군가가 나를 도울 수있을만큼 분명하게 만들 수 있기를 바랍니다. 나는 그것을 관리자라고 부를 수있는 대상이 있고, 관리자는 그가 관리하는 사람들의 모음을 가지고 있고, 사람들은 모두 iPerson을 구현하지만 다른 유형의 사람들은 다른 속성을 가지고 있습니다. 이 관리자를 트리에 표시하고 싶습니다. 관리자 노드 아래에서 관리하는 모든 프로젝트를 보여주고 싶습니다.

따라서 계획은 변환기를 사용하여 사람을 프로젝트 목록으로 변환하는 것입니다. 여기 XAML이 있습니다.

<HierarchicalDataTemplate DataType="{x:Type ui:Manager}">
   <TextBlock Text="{Binding Path=Name}"/>
    <HierarchicalDataTemplate.ItemTemplate>
        <DataTemplate>
                    <TextBlock Text="{Binding}"/>
        </DataTemplate>
    </HierarchicalDataTemplate.ItemTemplate>
    <HierarchicalDataTemplate.ItemsSource>
        <Binding Path="People">
            <Binding.Converter>
                <configUtil:ProjectListConverter/>
            </Binding.Converter>
        </Binding>
    </HierarchicalDataTemplate.ItemsSource>
</HierarchicalDataTemplate>

내 개인 수업은 InotifyPropertyChanged를 구현하고 사람들을 고정시키는 목록은 inotifyCollectionChanged를 구현합니다.이 코드는 TreeView 항목 소스를 설정하면 관리자에게 프로젝트 목록이 표시됩니다.

그러나 사람들 목록에 새로운 사람을 추가하면 TreeView가 업데이트되지 않습니다. 디버그 할 때 CollectionChanged가 추가 작업 및 추가 항목으로 발사되고 있음을 알 수 있습니다. 또한 CollectionChanged 이벤트는 Null이 아니므로 UI가보고 있다는 것을 알고 있습니다. 그러나 항목이 추가되면 변환기가 실행되지 않습니다.

다음은 iPerson 객체를 보유하는 목록의 추가 메소드입니다.

public void Add(T item)
{
    list.Add(item);
    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}

나는 어떻게 든 데이터 바인딩을 깨고 있습니까?

다른 어떤 것들을 확인할 수 있습니까?

컨버터는 People 목록의 각 항목을보고 그들이 작업중인 프로젝트를 파악하고 프로젝트 이름을 출력 목록에 추가합니다.

도움이 되었습니까?

해결책

컨버터는 컬렉션을 저장하는 속성에 적용됩니다. 따라서 컬렉션 인스턴스 자체가 변경된 경우에만 호출됩니다 (컬렉션의 항목이 변경된 경우가 아님). 이 주위의 한 가지 방법은 새로 고침을 원할 때 컬렉션을 무효화하는 것입니다.

수집 속성을 무효화하고 변환기 코드가 다시 실행되는 가장 간단한 방법은 다음과 같습니다. null 컬렉션을 제외하고 재 할당하십시오. 또 다른 방법은 얻는 것입니다 BindingExpression (을 통해 BindingOperations) 그리고 전화 UpdateTarget. 마지막으로, 대신 a에 묶을 수 있습니다 CollectionView (또는 하위 클래스) 및 전화 Refresh 그 위에.

만약 너라면 진짜 문제를 깨끗하게 고치려면 자신의 구현에 결합 할 수 있습니다. ICollectionView 필터링을 수행하고 필요에 따라 이벤트를 제기합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top