您的位置:首页 > 其它

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

2017-08-11 11:13 1126 查看
昨天在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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: