是否可以将 WPF 中的命令绑定到数据网格中的列标题?

问题描述 投票:0回答:1

我想将排序命令绑定到 DataGridColumn.Header,如果它绑定到按钮,则该函数可以工作,但我想在数据网格的列标题中实现它。我使用 MVVMCross 作为模式,因此我应该使用 IMVXCommand 来触发该函数。

这是我在 WPF 中的 XAML 代码,如果单击“SortColumn”按钮,则不会发生任何情况。

<DataGridTemplateColumn  Width="300" >
    <DataGridTemplateColumn.Header>
        <Button Content="SortColumn" Command="{Binding IMvxSortCommand}"/>
    </DataGridTemplateColumn.Header>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Names}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

谢谢。

阅读 Stackoverflow 上的一些讨论并尝试不同的方法。

c# wpf mvvmcross
1个回答
0
投票

DataGrid
的标题在内部排列有
ItemsPresenter
,因此每个项目都会失去其父项目的
DataContext

如果遇到此类麻烦,您应该始终查看 XAML 绑定失败

下一步是使用 SnoopWPF 检查应用程序,您可以通过

ItemsPresenter
查看问题。

要解决此问题,您必须重置 DataContext 或调整绑定路径,例如

<DataGrid x:Name="theGrid">
 
    <!-- Option 1 -->

    <DataGridTemplateColumn  Width="300" >
        <DataGridTemplateColumn.Header>
            <Button Content="SortColumn" Command="{Binding Element=theGrid, Path=DataContext.IMvxSortCommand}"/>
        </DataGridTemplateColumn.Header>
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Names}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>

    <!-- Option 2 -->

    <DataGridTemplateColumn  Width="300" >
        <DataGridTemplateColumn.Header>
            <Button DataContext="{Binding theGrid.DataContext}" Content="SortColumn" Command="{Binding IMvxSortCommand}"/>
        </DataGridTemplateColumn.Header>
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Names}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>

    <!-- Option 3 -->

    <DataGridTemplateColumn  Width="300" >
        <DataGridTemplateColumn.Header>
            <Grid DataContext="{Binding theGrid.DataContext}">
                <Button Content="SortColumn" Command="{Binding IMvxSortCommand}"/>
            </Grid>
        </DataGridTemplateColumn.Header>
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Names}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid>
© www.soinside.com 2019 - 2024. All rights reserved.