DataGrid标头中的WPF DataBinding

时间:2014-08-20 03:19:11

标签: c# wpf mvvm data-binding datagrid

我试图将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>

3 个答案:

答案 0 :(得分:1)

上述答案在我的情况下不起作用,因此我使用了 Initialized 事件触发器

解决了

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

太迟了,要花几年的时间..但我希望这对任何人都可以帮助:)

答案 1 :(得分:0)

这可以通过转到Window获取其DataContext并从那里开始。还有更好的方法吗?

<CheckBox IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Test}">Test Chkbox</CheckBox>

答案 2 :(得分:0)

如果属性不在集合中,你可能有一个很好的答案,其他的重写就是使用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>

以上示例基于以下假设:属性TestChannels属性位于同一个VM中。