簡體   English   中英

DataGrid 標頭中的 WPF 數據綁定

[英]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>

上面的示例基於屬性TestChannels屬性在同一 VM 中的假設。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM