2016-08-02 123 views
4

我试图创建包含itemscontroldatagrid的自定义标头,该标头绑定到ObservableCollection<DateTime>如何使用Databound自定义DataGrid的标题Itemscontrol

(基本上,我想创建12列,每个月一个 - >见图片)。

enter image description here

为什么这个代码不工作?

代码

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

更新我将问题范围缩小到绑定。下面的代码工作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> 

更新视图模型

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

您如何使用该模板? – Johannes

+0

它位于DataGrid中。我只是更新了代码。还是你的意思是别的? –

回答

2

有,因为你对日期绑定不看数据方面的问题。

这应该通过名称引用数据网格来解决问题。

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

这个伎俩。但是,我有问题遵循它背后的逻辑。该模板是在网格中指定的,那么为什么我必须重新命名呢? –

+0

datacontext没有被继承,唯一的一点是恢复* lost * datacontext ...也许另一个例子[这里](https://social.msdn.microsoft.com/Forums/vstudio/en-US/12a5277f- 16df-4899-9cad-b82c57e8fd9b/datacontext-lost-in-headertemplate?forum = wpf)他们说的地方......“标题的源对象没有明显的选择。除非在这种情况下,有一种方法这将解释为什么你的HeaderTemplate不是简单地从顶层继承DataContext“(当然这是一种不同的情况) – 2016-09-11 10:32:51