ContentTemplate
을 사용하여 스타일이 지정된 ContentControl
의 창이 있습니다.WPF (XAML) ListBox 내에서 바인딩 ItemTemplate
ContentTemplate
은 간단한 ListBox
이 Grid
안에 중첩되어 있습니다. Grid는 코드를 사용하여 DataContext
속성을 설정합니다 (CollectionViewSource
에 바인딩 됨 - cvs1이라고 함). ListBox ItemsSource
은 Grid에서 상속되며 ListBox 항목의 채우기가 정상적으로 작동합니다. 예 :
<Grid x:Name="Grid1">
<ListBox x:Name="ListBox1" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True"/>
</Grid>
ListBox의 스타일이 지정되고 기본 스타일은 ResourceDictionary에 저장됩니다.
ItemTemplate
을 사용하여 ListBox의 스타일 값을 설정하지만 DataTrigger
을 사용하여 다른 Setter를 동적으로 적용하는 것이 좋습니다. 내가 직면하고있는 도전 과제는 DataTrigger 내에서 별도의 CollectionViewSource (Cvs2라고 부르 자)에 Binding을 설정할 수없는 것입니다.
<Style TargetType="{x:Type ListBox}">
<Style.Triggers>
<!-- This seems to be trying to bind to cvs1, the error is it can't find the property -->
<DataTrigger Binding="{Binding cvs2, Path=TemplateName}" Value="ABC">
<Setter Property="ItemTemplate">
</DataTrigger>
<!-- This just doesn't seem to work -->
<DataTrigger Binding="{Binding Source={StaticResource cvs2},Path=TemplateName}" Value="XYZ">
<Setter Property="ItemTemplate">
</DataTrigger>
</Style.Triggers>
</Style>
ResourceDictionary
에는 cvs1과 cvs2가 정의되어 있습니다.
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="DataSources.xaml" />
</ResourceDictionary.MergedDictionaries>
문제는 내가 ItemTemplate
가 목록 상자에서의 DataContext를 상속한다 직면 할 것 그리고 내가 바인딩을 설정하기 위해이 문제를 얻이 수없는 것 :로 참조 다음
<CollectionViewSource x:Key="cvs1" />
<CollectionViewSource x:Key="cvs2" />
그리고
다음 cvs2 데이터 소스에 전달합니다. 나는 이것이 꽤 일상적인StaticResource
바인딩 작업이라고 생각했다. 그렇지 않은 것 같습니다.
작동
<Label Content="{Binding cvs2, Path=/TemplateName}"/>
이 레이블은 TEMPLATENAME의 값으로 채워집니다
나는 데이터를 디버깅 (메인 창에서) 그리드 외부의 라벨에 다음 코드를 테스트했습니다.
그러나 ItemsTemplate
에있는 DataTrigger
에서 이것을 사용하면 바인딩이 설정되지 않습니다.
ItemTemplate
에서 cvs2에 대한 바인딩을 어떻게 설정합니까?