2016-11-05 3 views
0

일종의 일정 그리드에 항목을 표시하는 컨트롤을 만들려고합니다. 그래서 어떤 범주에 속해 있으며 시간에 따라 세로로 배치됩니다 예정 시간 및 항목 완료까지 걸리는 시간 행이 추가됩니다데이터 형식을 사용하는 WPF 컨트롤 만들기

Public Interface ITimeGridItem 
    Property StartTime As Date 
    Property Duration As TimeSpan 
End Interface 

: 나는 단순히이 인터페이스를 사용하여 내 항목의

<Style TargetType="KHS:TimeGrid"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="KHS:TimeGrid"> 
        <Border Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
         <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled"> 
          <DockPanel> 
           <Grid Name="PART_HeaderGrid" DockPanel.Dock="Top"> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="{Binding ActualWidth, ElementName=TimeColumn}"/> 
            </Grid.ColumnDefinitions> 
           </Grid> 

           <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled"> 
            <Grid Name="PART_BodyGrid"> 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Name="TimeColumn" Width="Auto"/> 
             </Grid.ColumnDefinitions> 
            </Grid> 
           </ScrollViewer> 
          </DockPanel> 
         </ScrollViewer> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

: 저는 현재 System.Windows.Controls.Control에서 상속하고 기본 스타일과 템플릿은 다음과 같습니다 각 시간 증가 (기본적으로 15 분을 나타냄)에 대한 "BodyGrid"및 시작 시간 및 지속 시간을 기준으로 Grid.Row 및 Grid.RowSpan 값이 항목에 제공됩니다.

항목에 대해 DataTemplates를 구현하려고하면 문제가 발생합니다. 현재 ContentPresenters를 사용하여 항목을 표시하려고합니다. TimeGrid의 ItemTemplate 속성을 만들어 모든 항목에 사용하기는 쉽지만 고유 한 템플릿을 사용하여 여러 유형의 항목을 템플릿으로 작성해야하는 경우 어떻게해야합니까?

다른 컨트롤에서 다른 DataTypes를 사용하여 자신의 리소스 컬렉션에 DataTemplates를 추가하고 컨트롤에서 리소스를 검색하고 올바른 템플릿을 선택하는 방법을 생각해 보았습니다. 불행히도 나는 그것을 구현하는 방법을 알아낼 수 없었다. 아무도 내가 이것을 어떻게 할 수 있는지 안다? Microsoft는 자신의 통제에서 그렇게하기 때문에 가능할 것입니다.

+1

"불행히도 구현 방법을 파악하지 못했습니다."- 구현하지 않았기 때문입니다. 그냥 일어난다. 암시 적 DataTemplate이 범위에 있으면 사용됩니다. ContentControls에서 물건을 던지면 작동합니다. 해봐, 그게 효과가있을거야. –

+0

방향으로, System.Windows.Controls.DataTemplateSelector를 조사하십시오. 그것은 당신이 원하는 것에 열쇠를 쥘 수 있습니다. 그러나 나는 확실하지 않다. –

답변

0

오 세상에 나는 그렇게 단순하지 않다고 믿을 수 없다. 나는 실제로 그의 모든 것에서 명백한 논평을 위해 @ ed-plunkett에 약간의 기여를해야한다. 나는 조금 더 열심히 보면서 나는이 변경되었을 경우 사고에 의해 발견이에

<DataTemplate DataType="local:TestItem"> 

: 작동

<DataTemplate DataType="{x:Type local:TestItem}"> 

을! http://briannoyesblog.azurewebsites.net/2013/11/23/use-xtype-with-wpf-implicit-datatemplates


이 * 한숨 * 내가 이전에 발견했다 소원 :

몇 분 후, 나는이 기사를 발견했다.

{x : Type} 구문을 사용하는 한 DataTemplate을 범위에 넣을 수 있으므로 적용됩니다.

0

정확한 대답을 제공하기 위해 특정 구현에 대해 충분히 알지 못하지만 사용자 지정 템플릿을 적용한 래퍼 컨트롤을 사용한 다음 하위 뷰를 렌더링하는 ContentControl을 배치하는 방법을 살펴볼 것입니다. 그들이 템플릿으로 만들어 졌던 무엇이든간에.

내가 이런 식으로 표를 사용하지 않더라도, 내가 과거에해온 방법은 데이터 바인딩을 사용하는 것입니다. 표시하려는 모든 항목에 대한 뷰 모델을 만들고 X 및 Y 속성을 지정합니다. 그런 다음 XAML에서 배경으로 Canvas가있는 단일 ItemsControl을 사용하여 모든 항목을 그립니다. 항목의 Canvas.Top 및 Canvas.Left dp를 X 및 Y에 바인딩합니다. 이렇게하면 뷰 모델 코드가 원하는 위치에 어린이를 정확하게 배치 할 수 있고 뷰 클래스를 직접 호출하지 않고도 단위 테스트를 수행 할 수 있습니다. XAML로 지나치게 익숙해지기를 그만두고 느슨하게 결합 된 데이터 바인딩에 사용하기 만하면 복잡한 GUI 디자인이 갑자기 매우 쉽게 구현 될 수있었습니다.

관련 문제