2016-08-02 16 views
4

Ich habe versucht, eine benutzerdefinierte Kopfzeile von datagrid zu erstellen, die eine itemscontrol enthält, die an eine ObservableCollection<DateTime> gebunden ist.So passen Sie Header von DataGrid mit DataBound Itemscontrol an

(Grundsätzlich möchte ich 12 Spalten erstellen, eine für jeden Monat-> siehe Bild).

enter image description here

Warum dieser Code nicht funktioniert?

-Code

<DataGrid x:Name="dgProjects" AutoGenerateColumns="False" ItemsSource="{Binding Projects}" AlternationCount="2" AlternatingRowBackground="LightGray"> 
     <DataGrid.Columns> 
... 
<DataGridTemplateColumn Width="*"> 
    <DataGridTemplateColumn.HeaderTemplate> 
     <DataTemplate> 
      <ItemsControl Grid.Row="1" ItemsSource="{Binding Path=Monate}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ActualWidth}"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <Canvas /> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Date}" Background="LightGreen" Margin="1"/> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </DataTemplate> 
    </DataGridTemplateColumn.HeaderTemplate> 

aktualisieren verengt ich das Problem auf die Bindung. Der folgende Code funktioniert finde

<DataGridTemplateColumn.HeaderTemplate> 
    <DataTemplate> 
     <Grid> 
      <ItemsControl ItemsSource="{Binding Projects}">        
       <TextBlock Text="asdf" Background="LightGreen" Margin="1"/> 
       <TextBlock Text="asdf" Background="LightGreen" Margin="1"/> 
       <TextBlock Text="asdf" Background="LightGreen" Margin="1"/> 
      </ItemsControl> 
     </Grid> 
    </DataTemplate> 
</DataGridTemplateColumn.HeaderTemplate> 

aktualisieren Ansichtsmodell

public class vmProjektplanung : INotifyPropertyChanged 
    { 
     ... 
    #region "Monate" 

    public event System.Collections.Specialized.NotifyCollectionChangedEventHandler OnMonateChanged; 

    private List<DateTime> monate; 

    public List<DateTime> Monate 
    { 
     get { return monate; } 
     set { monate = value; OnPropertyChanged(new PropertyChangedEventArgs("Monate")); } 
    } 

    private void Monate_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     OnMonateChanged?.Invoke(sender, e); 
    } 

    #endregion 
     ... 
    } 
+0

Wie verwenden Sie diese Vorlage? – Johannes

+0

Es ist in einem DataGrid. Ich habe gerade den Code aktualisiert. Oder meintest du etwas anderes? –

Antwort

2

Es ist ein Problem, da Ihr die Termine Bindung nicht den Datenkontext sehen.

Dies sollte das Problem durch den Verweis auf das Datengrid anhand des Namens beheben.

<DataTemplate> 
     <ItemsControl ItemsSource="{Binding DataContext.Monate, ElementName=dgProjects}" 
+0

Das hat den Trick gemacht. Allerdings habe ich Probleme, der Logik dahinter zu folgen. Die Vorlage wird im Grid selbst angegeben. Warum muss ich sie erneut benennen? –

+0

Der Datenkontext wird nicht vererbt, der einzige Punkt ist, den * verlorenen * Datenkontext wiederherzustellen ... vielleicht ein anderes Beispiel [hier] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/12a5277f- 16df-4899-9cad-b82c57e8fd9b/datacontext-lost-in-headertemplate? Forum = wpf) wo sie sagen ... "Es gibt keine offensichtliche Wahl für das Quellobjekt des Headers.Unless in diesem Umstand, dass es einen Weg gibt Databound column generation. Das würde erklären, warum Ihr HeaderTemplate nicht einfach den DataContext von der obersten Ebene erbt. "(natürlich ist es eine andere Situation) –