将Datagrid列标题绑定到DatePicker选择

时间:2018-01-29 14:54:41

标签: wpf xaml

我试图将datagrid列标题绑定到datepicker中选择的日期。例如:

+--------------------------------------+
|               1/29/2018              |
+--------------------------------------+
|1/29/2018|1/30/2018|1/31/2018|2/1/2018|
+--------------------------------------+
|Available|Leave    |Available|Leave   |
|Leave    |Leave    |Available|Leave   |
+--------------------------------------+

使用:

<StackPanel>
  <DatePicker HorizontalAlignment="Center" Margin="0,0,0,0" VerticalAlignment="Top" Text="{Binding SelectedDate}"/>
  <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding UserScheduleViewModels}">
    <DataGrid.Columns>
      <DataGridTextColumn Header="Name" />
      <DataGridTextColumn Header="{Binding SelectedDate}" />
    </DataGrid.Columns>
  </DataGrid>
</StackPanel>

但是,我的第一列显示了Name应该如此,但第二列的日期只是空白。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

<StackPanel>
  <DatePicker HorizontalAlignment="Center" Margin="0,0,0,0" VerticalAlignment="Top" Text="{Binding SelectedDate}"/>
   <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding UserScheduleViewModels}">
    <DataGrid.Columns>
      <DataGridTextColumn Header="Name" />
       <DataGridTextColumn>
         <DataGridTextColumn.HeaderTemplate>
           <DataTemplate>
             <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=DataGrid},Path=DataContext.SelectedDate}"/>
           </DataTemplate>
         </DataGridTextColumn.HeaderTemplate>
      </DataGridTextColumn>
    </DataGrid.Columns>
  </DataGrid>
</StackPanel>

答案 1 :(得分:1)

数据上下文未通过DataGrid.Columns集合,因此在列定义上放置Binding无法在没有添加间接的情况下工作。

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding UserScheduleViewModels}">
  <DataGrid.Resources>
    <local:BindingProxy x:Key="proxy" Value="{Binding SelectedDate}" />
  </DataGrid.Resources>
  <DataGrid.Columns>
    <DataGridTextColumn Header="Name" />
    <DataGridTextColumn Header="{Binding Source={StaticResource proxy}, Path=Value}" />
  </DataGrid.Columns>
</DataGrid>

BindingProxy是一个实用工具类,可用于解决此类情况。我们的想法是将一个放在资源字典中并将其用作中介。您将其Value绑定到您需要的其他无法访问的数据,然后从继承上下文外部引用它作为绑定Source。与所有静态资源一样,BindingProxy资源声明必须在之前出现指向它的Binding(以Xaml解析顺序)。

public class BindingProxy : Freezable
{
    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register(
            "Value",
            typeof(object),
            typeof(BindingProxy),
            new PropertyMetadata(default(object)));

    public object Value
    {
        get { return (object)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }
}

尽管使用代理对象可能看起来不太理想,但它具有在大多数情况下工作的好处,您需要在正常继承上下文之外使用绑定。学习这种方法(及其工作原理)可能会在未来的类似情况下帮助您。例如,如果您需要ToolTip内的绑定,这将派上用场。