Wpf ItemsControl将DataContext设置为Datagrid中的项

Wpf ItemsControl将DataContext设置为Datagrid中的项,wpf,xaml,Wpf,Xaml,我想创建一种甘特图规划工具。第一列应显示每个计划步骤的数据。第二列应该承载一个画布,其中显示一个文本框,而Left和Width值则来自数据。这可以正常工作,但画布始终显示Planings集合中所有项目的文本框,而不是根据记录行显示的文本框 我很确定这条线就是问题所在: <ItemsControl ItemsSource="{Binding DataContext.Planings, ElementName=dgPlanings}" > 因为它引用了整个集合而不是记录 <D

我想创建一种甘特图规划工具。第一列应显示每个计划步骤的数据。第二列应该承载一个画布,其中显示一个文本框,而Left和Width值则来自数据。这可以正常工作,但画布始终显示Planings集合中所有项目的文本框,而不是根据记录行显示的文本框

我很确定这条线就是问题所在:

<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设置为什么?

如果您只想为每行显示一个
文本框,为什么要使用
ItemsControl
?这没有多大意义。
ItemsControl
ItemsSource
只能设置或绑定到
IEnumerable

您应该将
画布
文本框
直接放入数据模板:

<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>

如果您只想为每行显示一个
文本框,为什么要使用
项控件?这没有多大意义。
ItemsControl
ItemsSource
只能设置或绑定到
IEnumerable

您应该将
画布
文本框
直接放入数据模板:

<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>


当然可以!谢谢我想显示columnheader中的所有条形图,这与itempresenter配合得很好。。。有时候你会被卡住,当然!谢谢我想显示columnheader中的所有条形图,这与itempresenter配合得很好。。。有时候你会陷入困境。