我试图将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应该如此,但第二列的日期只是空白。有什么想法吗?
答案 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
内的绑定,这将派上用场。