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