前段時間一直很忙,老板催得緊:(
從今天開始,陸續記錄一些。
在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}}" />