WPF中使用DataGrid后,里面的Button的Command不响应的问题

前一篇说了一个较为复杂的方案,以解决向外代理绑定的问题,上一篇的方案在WPF中是不适用的。现在可以提一个较为通用的方案,可以为WPF及SL共同解决的。方案很简单。

 1 <DataGrid ItemsSource="{Binding Path=AccountStore}">
 2             <DataGrid.Columns>
 3                 <DataGridTextColumn Header="账户名称" Binding="{Binding Path=AccountName}"/>
 4                 <DataGridTemplateColumn Header="相关操作">
 5                     <DataGridTemplateColumn.CellTemplate>
 6                         <DataTemplate>
 7                             <Button Command={Binding Path=Edit}>编辑</Button>
 8                         </DataTemplate>
 9                     </DataGridTemplateColumn.CellTemplate>
10                 </DataGridTemplateColumn>
11             </DataGrid.Columns>
12         </DataGrid>

显然这样,Edit的Command是属于AccountStore的,这样位置就乱了。这里我们只需要设定它的RelativeSource就可以了。我们可以改成这样

<UserControl x:Class="KnetSmartBox.ReportModule.Views.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <DataGrid ItemsSource="{Binding Path=AccountStore}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="账户名称" Binding="{Binding Path=AccountName}"/>
                <DataGridTemplateColumn Header="相关操作">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Command="{Binding Path=DataContext.Edit,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}">编辑</Button>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</UserControl>

注意标黄的一段,自己理解一下。

这个属性可以让控件找寻DataContext,这里常用的有两种方式,这里用的是AncestorType,也就是根据类型找,还可以根据级别找,就是AncestorLevel。

原文地址:https://www.cnblogs.com/ca47/p/2511741.html