wpf mvvm datagrid DataGridTemplateColumn的绑定无效的可能原因之一!

昨天在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:
  private ICommand _deleteCommand;

        public ICommand DeleteCommand
        {
            get { return _deleteCommand; }
            set
            {
                _deleteCommand = value;
                RaisePropertyChanged();
            }
        }
  public TodoViewModel()
        {
            FreshCommand = new RelayCommand(DoFreshCommand, () => true);
            DeleteCommand = new RelayCommand(DoDeleteCommand, () => true);
            DoneCommand = new RelayCommand(DoDoneCommand, () => true);
        }
 private void DoDeleteCommand()
        {
            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.
posted @ 2017-07-28 11:04  ddockerman  阅读(739)  评论(0编辑  收藏  举报