2

내가 WPF에서 간단한 2 단계 트 리뷰 (MVVM 접근 방식을) 만들려고하고 있습니다. 내 첫 번째 수준에는 표준 데이터 템플릿이 있고, 두 번째 수준에서는 Template Selector를 사용하여 해당 속성 중 하나를 기반으로 각 항목의 모양을 변경할 수 있습니다. 다음은 WPF 트 리뷰 HierarchicalDataTemplate ItemTemplateSelector

내 트 리뷰 XAML입니다

<Treeview ItemsSource={Binding ListA}> 
     <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding ListB}" ItemTemplateSelector={StaticResource TemplateSelector}> 
     <Textblock Text={Binding Name}/> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

내 첫 번째 수준이다

<Textblock Text={Binding Name}/> 

단지 TemplateSelector이 같은 것입니다 DataTemplate이 반환되는 이름 내 두 번째 수준에 대한

를 표시합니다

<DataTemplate x:Key="SomeKey"> 
<StackPanel Orientation="Horizontal"> 
<ViewBox> 
----- 
</ViewBox> 
<TextBlock Text={Binding Name}/> 
</StackPanel> 
</DataTemplate> 

두 번째 레벨의 ViewModel 이름은 두 번째 레벨입니다. 템플릿 선택기를 두 번 확인했는데 올바른 데이터 템플릿을 확실히 반환하고 있지만 표시되지 않습니다.

사람이 올바른 방향으로 날 지점시겠습니까?

편집 -이 내 템플릿 선택입니다 요청

에 따라 더 많은 코드를 추가

public class DataFieldsDataTemplateSelector : DataTemplateSelector 
{ 
public DataTemplate AlphaTemplate { get; set; } 
public ------ 
public ------ 
public DataFieldsDataTemplateSelector() 
{ 
//This is getting the template from my ResourceDictionary 
AlphaTemplate = (DataTemplate)dDictionary["alphaTemplate"]; 
} 
public override DataTemplate SelectTemplate(object item,DependencyObject container) 
     { 
//Somecode 
return AlphaTemplate; 
} 
} 

내 사전에 AlphaTemplate 내 템플릿 내 클래스 b를 입력이 이름을 포함

<DataTemplate x:Key="alphaTemplate"> 

      <Grid > 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="15"/> 
        <ColumnDefinition Width="*"/> 
       </Grid.ColumnDefinitions> 
       <Viewbox IsHitTestVisible="False"> 

        <Path Data="M0,0L56.622002,0 56.622002,14.471 35.715,14.471 35.715,64 20.715,64 20.715,14.471 0,14.471z" Stretch="Uniform" Fill="{DynamicResource ButtonForegroundNormal}" VerticalAlignment="Center" Width="15" Height="15" Margin="0,0,0,0" RenderTransformOrigin="0.5,0.5"> 
         <Path.RenderTransform> 
          <TransformGroup> 
           <TransformGroup.Children> 
            <RotateTransform Angle="0" /> 
            <ScaleTransform ScaleX="1" ScaleY="1" /> 
           </TransformGroup.Children> 
          </TransformGroup> 
         </Path.RenderTransform> 
        </Path> 

       </Viewbox> 
       <textBlock Text="{Binding Name}/> 
      </Grid> 
    </DataTemplate> 

입니다 (텍스트) 및 데이터 형식 (텍스트) 필드 데이터 형식이 알파 인 경우 내 templateSelector에 AlphaTemplate을 반환하는 등

두 번째 수준에 항목을 추가하는 창에 작업 (dragDrop)이 있습니다. 템플릿 선택기가 데이터 유형에 따라 누락 된 항목에 대해 올바른 데이터 템플릿을 선택해야합니다.

내 기본 ViewModel에 TypeA 개체의 ICollectionView가 있고 각 TypeA ViewModel에 TypeB ViewModels의 ICollectionView가 포함되어 있습니다.

당신은 아무것도에게 나는이 같은이 코드를 디버깅 할 필요에 어떤 문제가 있는지 잘 모릅니다

+0

을 난 그냥 괜찮 았는데 내 말에이 시나리오에는 시도. 템플릿 선택기 코드를 xaml과 코드 배후 및 ListB 클래스 형식으로 공유 할 수 있습니까 – Nitin

+0

원래 질문에 더 많은 코드를 추가했습니다. 필요한 것이 있으면 알려주세요. – Krishna

+0

잘 모르겠다. 나는 잘 해내려고 노력했다. 사전에서 템플릿을 설정하면 템플릿이 적용됩니다. 출력 창에 바인딩 예외가 있는지 알 수 있습니까? – Nitin

답변

2

필요하면 알려주세요,하지만 당신은 당신의 b를 입력의 기본 DataTemplate을 정의하여 수행 할 수 있습니다 달성하기 위해 원하는 것을하고 다음은이 같은 바인딩에 따라 내용을 전환 :

<DataTemplate DataType="{x:Type TypeB}"> 
    <ContentControl> 
     <ContentControl.Style> 
      <Style TargetType="{x:Type ContentControl}"> 
       <Setter Property="ContentTemplate"> 
        <Setter.Value> 
         <!-- Default template here for your item --> 
        </Setter.Value> 
       </Setter> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding XYZ}" Value="true"> 
         <Setter Property="ContentTemplate"> 
          <Setter.Value> 
           <!-- Different template for your item --> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl>   
</DataTemplate> 

감사

+0

답장을 보내 주셔서 감사합니다. 트리거를 사용하여 솔루션을 사용할 수 있지만 프로젝트의 다른 위치에서 ListBox에 사용한 것과 동일한 templateSelector를 다시 사용하려고 할 때 제네릭 솔루션을 찾으려고합니다. 또한 TypeB의 항목에 대한 15 개 이상의 datatemplates가 있으며 한 곳에서 모두 유지하려고했습니다. 동일한 TemplateSelector를 사용하는 다른 목록 상자는 올바르게 작동하지만 (올바른 데이터 템플릿을 표시 함) – Krishna