如何使用数据绑定的ItemsControl自定义DataGrid的标题栏

3
我尝试创建一个自定义的标题栏,其中包含一个 datagrid 和一个绑定到 ObservableCollection<DateTime>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>

更新 我将问题缩小到了绑定上。以下代码可以正常工作。

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

你如何使用那个模板? - user5747953
它在DataGrid内部。我刚刚更新了代码。或者你是指其他的东西? - Mister 832
1个回答

2
你的日期绑定存在问题,因为它无法看到数据上下文。通过按名称引用数据网格来修复此问题。
<DataTemplate>
       <ItemsControl ItemsSource="{Binding DataContext.Monate, ElementName=dgProjects}"

这样做可以解决问题。但是,我在跟进它背后的逻辑时遇到了问题。模板已在网格本身内指定,我为什么还要再命名一次呢? - Mister 832
DataContext没有被继承,唯一的目的是恢复丢失的DataContext...也许这里有另一个例子链接,他们说... "在头部模板中,没有明显的选择作为头部的源对象。除非在这种情况下,有一种方法可以生成数据绑定列。这就解释了为什么你的HeaderTemplate并不简单地从顶层继承DataContext。"(当然这是不同的情况) - user6996876

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接