해당 개체를 기반으로 DataTemplateSelector를 적용할 수 있도록 WPF 컨트롤의 콘텐츠를 해당 컨테이너의 DataContext에 바인딩하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/5036835

  •  15-11-2019
  •  | 
  •  

문제

두 개의 컬렉션 A와 B가 포함된 ViewModel 위에 WPF 창을 바인딩하려고 합니다.DataTemplates를 사용하여 ViewModel의 플래그 설정에 따라 A 또는 B를 표시하려고 합니다.

이를 위해 저는 창의 DataContext = ViewModel.그러나 바인딩을 시도할 때 ContentControl 해당 DataContext에 적용하고 DataTemplateSelector 그것에, item 선택자의 매개변수 SelectTemplate(object item, DependencyObject container) 메소드는 항상 null입니다.

<Window [snip] Title="MainWindow">
    <Window.Resources>
        <!-- DataTemplate and Selector declarations -->
    </Window.Resources>
    <Grid>
        <ContentControl Content="{Binding}"              
                        ContentTemplateSelector="{StaticResource templateSelector}" />
    </Grid>    
</Window>

그걸 어떻게 묶어야 하지? ContentControl 창의 ViewModel이 해당 창으로 전달됩니다. DataTemplateSelector?

도움이 되었습니까?

해결책

이것은 나에게 효과적이었습니다.

<ContentControl Content="{Binding DataContext, RelativeSource={RelativeSource Self}}"              
                    ContentTemplateSelector="{StaticResource templateSelector}" />

편집하다:

하지만 나는 이것이 일을 성취하는 최선의 방법이 아닐 수도 있다는 Aaron의 의견에 동의합니다.ViewModel을 사용하고 있다고 말씀하셨습니다.가장 쉬운 방법은 아마도 원하는 컬렉션을 노출하는 Viewmodel의 새로운 "SelectedCollection" 속성에 ItemsControl을 바인딩하는 것입니다.그런 다음 플래그에서(속성이라고 가정) "SelectedCollection"에 대해 propertychanged를 실행할 수 있습니다.

다른 팁

여기서 많은 일이 일어나고 있습니다 ...

사용하고 있다고 하셨습니다. DataTemplateSelector 컬렉션 A 또는 컬렉션 B를 표시하는 동시에 컬렉션 중 하나를 DataContext 창의.

한 컬렉션의 데이터를 숨기려면 컬렉션 자체에 대한 필터링을 수행하세요.또 다른 접근 방식은 다음을 통해 바인딩을 실행하는 것입니다. IValueConverter 또는 IMultiValueConverter.또 다른 해결책은 두 개의 UI 요소를 각 컬렉션에 각각 바인딩하고 Visiblity ViewModel의 값을 기반으로 UI 요소를 만듭니다.

다양한 옵션이 있습니다. 제가 이해한 바가 맞다면 DataTemplateSelector 그 중 하나가 되어서는 안 됩니다.

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