2017-03-12 7 views
0

ガントチャートの計画ツールの種類を作成したいと思います。最初の列には、各計画ステップのデータが表示されます。 2番目の列はテキストボックスが表示されているキャンバスをホストする必要がありますが、左と幅の値はデータから派生します。これは問題なく動作しますが、キャンバスには、レコードの行に従うものではなく、常にPlaningsコレクションのすべての項目がテキストボックスで表示されます。ItemsControl DataGridのItemにDataContextを設定します

私はこの行が問題であることをかなり確信している:

<ItemsControl ItemsSource="{Binding DataContext.Planings, ElementName=dgPlanings}" > 

それが記録するのではなく、コレクション全体を参照として。

<DataGrid x:Name="dgPlanings" AutoGenerateColumns="False" ItemsSource="{Binding Planings}" CanUserAddRows="False" HeadersVisibility="Column"> 
    <DataGrid.Columns> 
     <!--Baustellenspalte--> 
     <DataGridTemplateColumn Width="300"> 
      <DataGridTemplateColumn.HeaderTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="20"/> 
          <ColumnDefinition Width="100" /> 
          <ColumnDefinition Width="100" /> 
          <ColumnDefinition Width="50" /> 
         </Grid.ColumnDefinitions> 
         <TextBox Text="Nr" Grid.Column="0"></TextBox> 
         <TextBox Text="To" Grid.Column="1"></TextBox> 
         <TextBox Text="Till" Grid.Column="2"></TextBox> 
         <TextBox Text="&#xE77B;" FontFamily="Segoe MDL2 Assets" Grid.Column="3"></TextBox> 
        </Grid> 
       </DataTemplate> 
      </DataGridTemplateColumn.HeaderTemplate> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="20"/> 
          <ColumnDefinition Width="100" /> 
          <ColumnDefinition Width="100" /> 
          <ColumnDefinition Width="50" /> 
         </Grid.ColumnDefinitions> 
         <TextBox ></TextBox> 
         <DatePicker SelectedDate="{Binding To, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1"></DatePicker> 
         <DatePicker SelectedDate="{Binding Till, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="2"></DatePicker> 
         <TextBox Text="{Binding Workers}" Grid.Column="3"></TextBox> 
        </Grid> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 

     <!--Planungsspalte--> 
     <DataGridTemplateColumn > 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ItemsControl ItemsSource="{Binding DataContext.Planings, ElementName=dgPlanings}" > 
         <ItemsControl.ItemContainerStyle> 
          <Style TargetType="ContentPresenter"> 
           <Setter Property="Canvas.Left"> 
            <Setter.Value> 
             <MultiBinding Converter="{StaticResource d2x}"> 
              <Binding Path="To" Mode="OneWay" diag:PresentationTraceSources.TraceLevel="High" /> 
              <Binding Path="ActualWidth" ElementName="coPlanung" Mode="OneWay"/> 
             </MultiBinding> 
            </Setter.Value> 
           </Setter> 
           <Setter Property="Canvas.Right"> 
            <Setter.Value> 
             <MultiBinding Converter="{StaticResource d2x}"> 
              <Binding Path="Till" Mode="OneWay" /> 
              <Binding Path="ActualWidth" ElementName="coPlanung" Mode="OneWay"/> 
             </MultiBinding> 
            </Setter.Value> 
           </Setter> 
          </Style> 
         </ItemsControl.ItemContainerStyle> 
         <ItemsControl.ItemsPanel> 
          <ItemsPanelTemplate> 
           <Canvas Width="{Binding ActualWidth, ElementName=coPlanung}" Background="White" Height="30" Margin="0"/> 
          </ItemsPanelTemplate> 
         </ItemsControl.ItemsPanel> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate> 
           <TextBox Text="{Binding Path=To }"></TextBox> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 

itemssourceのDataContextを設定する必要はありますか?

答えて

2

ItemsControlなぜ、各行に1つだけTextBoxを表示したいのですか?これはあまり意味がありません。 ItemsControlItemsSourceは、IEnumerableにのみ設定またはバインドすることができます。

あなたはDataTemplateのに直接CanvasTextBoxを置く必要があります。コースの

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Canvas Width="{Binding ActualWidth, ElementName=coPlanung}" Background="White" Height="30" Margin="0"> 
       <TextBox Text="{Binding Path=To}"> 
        <TextBox.Style> 
         <Style TargetType="TextBox"> 
          <Setter Property="Canvas.Left"> 
           <Setter.Value> 
            <MultiBinding Converter="{StaticResource d2x}"> 
             <Binding Path="To" Mode="OneWay" diag:PresentationTraceSources.TraceLevel="High" /> 
             <Binding Path="ActualWidth" ElementName="coPlanung" Mode="OneWay"/> 
            </MultiBinding> 
           </Setter.Value> 
          </Setter> 
          <Setter Property="Canvas.Right"> 
           <Setter.Value> 
            <MultiBinding Converter="{StaticResource d2x}"> 
             <Binding Path="Till" Mode="OneWay" /> 
             <Binding Path="ActualWidth" ElementName="coPlanung" Mode="OneWay"/> 
            </MultiBinding> 
           </Setter.Value> 
          </Setter> 
         </Style> 
        </TextBox.Style> 
       </TextBox> 
      </Canvas> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
+0

!ありがとう。私はitempresenterとうまく動作するcolumnheaderのすべてのバーを表示したい...あなたがちょうど立ち往生するいくつかの日。 –

関連する問題