/ / ItemsControl setzt DataContext in einem Datagrid auf Item - wpf, xaml

ItemsControl setzt DataContext auf Item in einem Datagrid - wpf, xaml

Ich möchte eine Art Gantt-Chart-Planung erstellenWerkzeug. In der ersten Spalte sollten die Daten jedes Planungsschritts angezeigt werden. Die zweite Spalte sollte eine Zeichenfläche enthalten, in der ein Textfeld angezeigt wird, während die Werte für Links und Breite aus den Daten abgeleitet werden. Dies funktioniert in Ordnung, aber auf der Leinwand werden immer Textfelder mit allen Elementen der Planings-Auflistung angezeigt, anstatt der Elemente gemäß der Zeile des Datensatzes.

Ich bin mir ziemlich sicher, dass diese Zeile das Problem ist:

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

da es sich auf die gesamte Sammlung anstatt auf die Aufzeichnung bezieht.

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

Worauf muss ich den DataContext der itemssource einstellen?

Antworten:

2 für die Antwort № 1

Warum benutzt du ein ItemsControl wenn Sie nur eine einzige anzeigen möchten TextBox Für jede Reihe? Das macht nicht viel Sinn ItemsSource eines ItemsControl kann nur gesetzt oder an ein gebunden werden IEnumerable.

Sie sollten die setzen Canvas und das TextBox direkt in die DataTemplate:

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