[英]WPF DataBinding in a DataGrid Header
我正在尝试将 ViewModel 属性绑定到 DataGrid 标头中的 Checkbox。
如果我将它随机粘贴在窗口中,复选框绑定得很好,但如果它在数据网格的标题中,它不会在任何一个方向绑定。
DataGrid 中的数据也可以很好地绑定。
问题似乎是 HeaderTemplate 没有绑定到主视图模型。 我假设它绑定了 ItemSource。
如何绑定到标题中的视图模型?
<DataGrid ItemsSource="{Binding Channels}" AlternationCount="2" Grid.IsSharedSizeScope="True" AutoGenerateColumns="False" AlternatingRowBackground="{StaticResource GroupBackgroundBrush}" SelectedIndex="{Binding Path=CursorChannelInt}" >
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=Test}">Test Chkbox</CheckBox>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=stuff}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
这是可行的,方法是转到 Window,获取其 DataContext,然后从那里开始。 有没有更好的办法?
<CheckBox IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Test}">Test Chkbox</CheckBox>
上述答案在我的情况下不起作用,所以我使用Initialized event trigger 解决了
.xaml
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox Initialized="CheckBox_Initialized" IsChecked="False">Test Chkbox</CheckBox>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
.xaml.cs
private CheckBox cb_All = null;
private void CheckBox_Initialized(object sender, EventArgs e)
{
cb_All = (CheckBox)sender;
}
private void Function()
{
if(cb_All != null)
cb_All.IsChecked = true; //or false
}
太晚了,花了几年时间..但我希望这可以帮助任何人:)
如果该属性不在集合中,您可能有一个很好的答案,其他相同的重写是使用ElementName
来缩短绑定语法
样本
<DataGrid ItemsSource="{Binding Channels}" AlternationCount="2" Grid.IsSharedSizeScope="True" AutoGenerateColumns="False" AlternatingRowBackground="{StaticResource GroupBackgroundBrush}" SelectedIndex="{Binding Path=CursorChannelInt}"
x:Name="dGrid">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding DataContext.Test, ElementName=dGrid}">Test Chkbox</CheckBox>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=stuff}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
上面的示例基于属性Test
与Channels
属性在同一 VM 中的假设。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.