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。