【问题标题】:WPF DataBinding in a DataGrid HeaderDataGrid 标头中的 WPF 数据绑定
【发布时间】:2014-10-13 07:25:09
【问题描述】:

我正在尝试将 ViewModel 属性绑定到 DataGrid 标题中的复选框。

如果我将复选框随机粘贴在窗口中,则复选框绑定得很好,但如果它在数据网格的标题中,它不会在任一方向绑定。

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>

【问题讨论】:

  • 向我们展示视图模型。并突出显示您要绑定的属性。

标签: c# wpf mvvm data-binding datagrid


【解决方案1】:

这可行,方法是转到 Window,获取它的 DataContext,然后从那里开始。有没有更好的办法?

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

【讨论】:

    【解决方案2】:

    如果该属性不在集合中,您可能会有一个不错的答案,其他相同的重写方法是使用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 的假设。

    【讨论】:

      【解决方案3】:

      以上答案在我的情况下不起作用,所以我使用 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 
      }
      

      太晚了,花了好几年..但我希望这对任何人都有帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-02
        • 2011-05-06
        • 2012-08-17
        • 2011-06-15
        • 1970-01-01
        • 2020-09-27
        • 1970-01-01
        • 2011-03-22
        相关资源
        最近更新 更多