【问题标题】:How to bind a ICommand into a Button out of DataContext?如何将命令绑定到 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

【问题讨论】:

    标签: wpf vb.net xaml data-binding icommand


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 2016-04-30
      • 1970-01-01
      • 2012-09-07
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多