如何将命令绑定到 DataContext 之外的按钮中?

Posted

技术标签:

【中文标题】如何将命令绑定到 DataContext 之外的按钮中?【英文标题】:How to bind a ICommand into a Button out of DataContext? 【发布时间】:2022-01-18 15:23:46 【问题描述】:

我在带有 DataContext (KeyValuePair) 的 DataGrid 中有一个按钮。 我想在这个按钮中实现一个命令。 但是如果我使用 Command="Binding CommandoTest" 它就不起作用了。

我在没有 DataContext 的情况下将 ICommand 测试到 Grid 中,效果很好。

                <DataGrid DataContext="Binding PersonList.Keys">
                    <DataGrid.Columns>
                        <DataGridTemplateColumn>
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Grid>
                                        <Button Command="Binding CommandoTest" Content="CommandoTest"></Button>
                                    </Grid>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                    </DataGrid.Columns>
                </DataGrid>

命令代码:

Public ReadOnly Property CommandoTest As ICommand
    Get
        Return CommandTest_exp
    End Get
End Property


Public Sub CommandTest_exp()
    MessageBox.Show("Test", "Test")
End Sub

【问题讨论】:

【参考方案1】:

我想DataGrid 在某个元素的内部,其DataContext 是带有CommandoTest 属性的元素。

如果是这种情况,使用 Grid 作为父级的示例,您可以使用:

<Grid x:Name="parent_grid">
    <DataGrid DataContext="Binding PersonList.Keys">
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                            <Button Command="Binding DataContext.CommandoTest, ElementName=parent_grid" Content="CommandoTest"></Button>
                        </Grid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

另一种不必命名任何控件的方法是(这不适用于前面示例中的 Grid,因为它首先会找到 Grid,它是你的Button,所以我添加了另一个Border类型的父元素):

<Border>
    <Grid>
        <DataGrid DataContext="Binding PersonList.Keys">
            <DataGrid.Columns>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Grid>
                                <Button Command="Binding DataContext.CommandoTest, RelativeSource=RelativeSource Mode=FindAncestor, AncestorType=x:Type Border" Content="CommandoTest"></Button>
                            </Grid>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Border>

【讨论】:

以上是关于如何将命令绑定到 DataContext 之外的按钮中?的主要内容,如果未能解决你的问题,请参考以下文章

MVVM从TabControl绑定到Page.DataContext

将 UserControl ListBox ItemSsource 绑定到父 DataContext 时出错

将 datacontext 字符串属性绑定到 StaticResource 键

WPF 绑定到父 DataContext

DataGridComboBoxColumn绑定到DataGrid DataContext

XAML - 绑定到 DataContext 并使用转换器?