>

WPF MVVM 동적 컨트롤 만들기-작업에 대한 세부 정보가있는 그리드가 있습니다.

이제 모든 작업에 대해 'n'개의 작업 변수가있을 수 있습니다. 작업에 대한 레코드를 가져올 때 이름-값 쌍인이 작업 변수 모음을 가져옵니다. 여기서 값은 모음 또는 날짜 시간 값 또는 int 또는 문자열 일 수 있습니다.

이제 여기서 달성하려는 것은 다음과 같습니다. -실행 변수가 날짜 시간이면 날짜 선택기가 필요합니다. -int/String 인 경우 텍스트 상자가 필요합니다 -컬렉션 인 경우 콤보 상자. -그것은 비트 필드이고 확인란입니다

각 작업마다 이러한 값이 다를 수 있으므로 달성 방법을 잘 모르겠습니다.


  • 답변 # 1

    이 이름/값 쌍을 나타내는 일종의 객체를 ItemsControl 에 넣을 것이라고 가정합니다.   ItemsSource 를 설정하여  속성.

    사용할 수있는 몇 가지 솔루션이 있습니다.

    DataTemplate 사용  트리거 포함 : 이 접근법은 YourPropertyType 를 통해 각 객체의 "유형"을 노출시키는 것을 포함합니다.  문자열로 속성. 당신은 ItemTemplate 를 설정합니다  당신의 ItemsControl 의   ContentControl 를 호스팅하는 템플릿에 . 와이즈 비즈  그 자체는 ContentControl 를 가질 것입니다  트리거로 동적으로 선택됩니다.

    이 모든 것은 XAML에서 선언적으로 수행 할 수 있습니다.

    나는 당신이 더 ContentTemplate 있다고 가정합니다  이름이 DataTemplates  (이것은 비어있을 수 있습니다), DefaultTemplate IntegerTemplate 등을 사용하여 각 사례에 대한 시각적 트리를 스케치합니다.

    이것은 StringTemplate 일 것입니다 :

    ItemsControl.ItemTemplate
    
    
    <DataTemplate> <ContentControl x:Name="MyContentControl" Content="{Binding}" ContentTemplate="{StaticResource DefaultTemplate}"/> <DataTemplate.Triggers> <DataTrigger Binding="{Binding YourPropertyType}" Value="Integer"> <Setter TargetName="MyContentControl" Property="ContentTemplate" Value="{StaticResource IntegerTemplate}" /> </DataTrigger> <DataTrigger Binding="{Binding YourPropertyType}" Value="String"> <Setter TargetName="MyContentControl" Property="ContentTemplate" Value="{StaticResource StringTemplate}" /> </DataTrigger> <!-- and so on --> </DataTemplate.Triggers> </DataTemplate> 사용 :

    이 접근 방식에는 코드 숨김이 필요하지만 각 이름/값 쌍의 "유형"을 문자열로 표시하지 않아도되며 훨씬 더 복잡한 논리에 사용할 템플릿을 선택할 수 있습니다.

    템플릿 선택자가 될 클래스를 생성합니다 :

    DataTemplateSelector
    
    

    그런 다음 어딘가에서 템플릿 선택기를 인스턴스화해야합니다 ( class YourObjectDataTemplateSelector : DataTemplateSelector { public DataTemplate DefaultTemplate { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { var yourObject = (YourObjectType) item; // Get hold of a DataTemplate based on any attribute of item var templateToUse = this.DefaultTemplate; return templateToUse; } } 내부에서 )

    UserControl
    
    
    내가 <UserControl.Resources> <localNamespace:YourObjectDataTemplateSelector x:Key="TemplateSelector" DefaultTemplate="{StaticResource DefaultTemplate}" /> </UserControl.Resources> 를 노출했다는 알림   DefaultTemplate 의 부동산  XAML의 템플릿으로 설정하십시오. 실제로 YourObjectDataTemplateSelector 유형의 더 많은 속성을 정의합니다   DataTemplate 에서 컨트롤의 리소스 사전에 템플릿 선택기를 추가 할 때 템플릿 선택기를 "구성"합니다. 이를 통해 YourObjectDataTemplateSelector 를 사용하여 각 사례에 대한 템플릿을 직접 설정할 수 있습니다  XAML의 태그 확장.

    마지막으로 템플릿 선택기를 StaticResource 에 연결하십시오. :

    ItemsControl
    
    

  • 답변 # 2

    귀하의 목표를 달성하기 위해 어떤 형태의 Data Templating과 DataTemplateSelector를 사용하고 있다고 생각합니다.

    <ItemsControl ItemsSource="..." ItemTemplateSelector={StaticResource TemplateSelector}" />

  • 이전 windows - 큰 텍스트 파일에서 마지막 n 줄 읽기
  • 다음 python - readlink () 함수를 구현하는 데 문제가 있습니다