ItemsControl将DataContext设置为Datagrid中的Item

时间:2017-03-12 14:55:58

标签: wpf xaml

我想创建一种甘特图规划工具。第一列应显示每个计划步骤的数据。第二列应承载显示文本框的画布,而左和宽度值则从数据派生。这样工作正常,但画布总是显示文本框的所有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设置为?

1 个答案:

答案 0 :(得分:2)

如果您只想为每一行显示一个ItemsControl,为什么使用TextBox?这没有多大意义。 ItemsSource的{​​{1}}只能设置或绑定到ItemsControl

您应该将IEnumerableCanvas直接放入DataTemplate:

TextBox