Silverlight DataGridTemplateColumn 中绑定事件
前段时间一直很忙,老板催得紧:(
从今天开始,陆续记录一些。
在Silverlight中,想实现DataGird中最后一列是自定义的操作按钮,并按照MVVM模式绑定DataGrid的数据源、按钮事件。
首先,初步想到的是这样子。
<sdk:DataGrid ItemsSource="{Binding AdjustCurves}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" AutoGenerateColumns="False" MinHeight="50" x:Name="dataGrid1" Visibility="{Binding IsShowList, Converter={StaticResource BooleanToVisibilityConverter1}}"> <sdk:DataGrid.Columns> <sdk:DataGridTextColumn Header="名称" Binding="{Binding CurveName}" IsReadOnly="True" MinWidth="120"/> <sdk:DataGridTemplateColumn Header="操作" > <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> <HyperlinkButton Content="编辑" Command="{Binding EditCommand}" /> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate> </sdk:DataGridTemplateColumn> </sdk:DataGrid.Columns> </sdk:DataGrid>
绑定代码:
private RelayCommand _editCommand; /// <summary> /// 编辑当前 /// </summary> public RelayCommand EditCommand { get { if (_editCommand == null) { _editCommand = new RelayCommand( () => MessageBox.Show("Edit")); } return _editCommand; } }
当然,按钮事件绑定是无效的,在VS的输出窗口中,可以看到错误信息(程序不会弹出错误,所以养成看输出窗口很重要啊),提示在绑定的数据源实体类找不到“EditCommand”属性。
试了很多方法后,最后在Google中找到了解决方案:Command binding inside a DataGridTemplateColumn
改为:
<HyperlinkButton Content="编辑" Command="{Binding Path=DataContext.EditCommand,RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" />
作者:Ivan