昨天在mvvm wpf的开发中遇到一个问题,绑定不起作用,编辑阶段没问题也没有提示找不到对应的绑定,但是在运行之后却不起作用,查了很多资料,说法不一,有些是要删除datagrid的一行,直接绑定delete即可,但是我要绑定的是viewmodel的command,最终解决问题了,特分享如下(已解决):
view:
<DataGrid ItemsSource="{Binding TodoList}"AutoGenerateColumns="False"CanUserAddRows="False"CanUserDeleteRows="False"CanUserReorderColumns="False"CanUserResizeColumns="False"CanUserResizeRows="False"CanUserSortColumns="False"IsReadOnly="True"SelectedItem="{Binding SelectedItem}"> <DataGrid.Columns> <DataGridTextColumn Header="Title"Binding="{Binding Title}"> </DataGridTextColumn> <DataGridTextColumn Header="Text"Binding="{Binding Text}"> </DataGridTextColumn> <DataGridTextColumn Header="InsertDateTime"Binding="{Binding InsertDateTime}"> </DataGridTextColumn> <DataGridTextColumn Header="EstimateDateTime"Binding="{Binding EstimateDateTime}"> </DataGridTextColumn> <DataGridTemplateColumn Header="Delete"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="Delete"Command="{Binding DeleteCommand}"> </Button> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
其中
DataGridTemplateColumn的button的command绑定无效,不起作用,
viewmodel:
privateICommand _deleteCommand; publicICommand DeleteCommand { get { return_deleteCommand; } set{ _deleteCommand =value; RaisePropertyChanged(); } } publicTodoViewModel() { FreshCommand = new RelayCommand(DoFreshCommand, () => true); DeleteCommand = new RelayCommand(DoDeleteCommand, () => true); DoneCommand = new RelayCommand(DoDoneCommand, () => true); } private voidDoDeleteCommand() { if (SelectedItem == null) return; MongoDbProvide.Delete<TodoInfos>(p => p._id ==SelectedItem._id); TodoList.Remove(SelectedItem); }
修改view如下解决:
<DataGridTemplateColumn Header="Delete"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="Delete"Command="{Binding ElementName=TodoViewTitle, Path=DataContext.DeleteCommand}"> </Button> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>
TodoViewTitle 为这个view的名称
总结:因datagrid已经指定了
ItemsSource="{Binding TodoList}"
所以内部的列的绑定会默认去找这个
ItemsSource的属性,如果要绑定一个独立的dp,必须要在绑定时指定element和path。
还有其他的列表控件listbox等也是一样,在编辑阶段时,通过view的绑定可以直接找到command,但是是不起作用的,要指定绑定的element和path.