根据我的要求,我在Row&中有一个编辑按钮/超链接。在Header Row中我应该在我的RadGridView控件中添加一个新的按钮/超链接。这些按钮将加载子窗口弹出窗口以添加/编辑数据。我的应用程序在Silverlight 5中使用Prism 4.1& MVVM(负责创建View方法的模型)。
我创建了一个像这样的按钮:
<telerik:GridViewColumn Width="80">
<telerik:GridViewColumn.Header>
<StackPanel Orientation="Horizontal"
VerticalAlignment="Top"
HorizontalAlignment="Center">
<telerik:RadButton DataContext="{Binding DataContext ,ElementName=LayoutRoot}"
prism:Click.Command="{Binding AddUserEventCommand}"
Content="Add User">
<!-- <Image Source="../../Assets/Images/icon_user_add.png"
Cursor="Hand" Stretch="None" Width="32" Height="32"/>-->
</telerik:RadButton>
</StackPanel>
</telerik:GridViewColumn.Header>
<telerik:GridViewColumn.CellTemplate>
<DataTemplate>
<telerik:RadButton prism:Click.Command="{Binding DataContext.EditUserEventCommand}">
<Image Source="../../Assets/Images/icon_user_update.png"
Cursor="Hand"
Stretch="None" Width="32" Height="32" >
</Image>
</telerik:RadButton>
</DataTemplate>
</telerik:GridViewColumn.CellTemplate>
</telerik:GridViewColumn>
但我的点击事件无效?
当我把同一个按钮放在网格上时,它对我起作用了。 其代码如下:
<telerik:RadButton Command="{Binding AddUserEventCommand}" Content="Add User" VerticalAlignment="Top"></telerik:RadButton>
根据几个线程,我发现DataContext可能是个问题。 https://compositewpf.codeplex.com/discussions/64514 所以我尝试通过以下方式更改Add Button的DataContext:
DataContext="{Binding DataContext ,ElementName=LayoutRoot}"
但仍然没有成功。
EditUserEventCommand,AddUserEventCommand都是DelegateCommand。
在我的ViewModel代码中是这样的:
public class UsersTabViewModel : TabViewModelBase , IUsersTabViewModel
{
/// Constructor
public UsersTabViewModel(IUsersTabView view):base(view) {
this.Header = "Users";
this.Title = "Users";
this.IsSelected = true;
ctx = new UserRiaDomainContext();
fillUser();
doEventBinding();
}
private void doEventBinding() {
AddUserEventCommand = new DelegateCommand(AddUser, CanAddUser);
UpdateUserEventCommand = new DelegateCommand(EditUser, CanEditUser);
}
/// Bind with User Add
private DelegateCommand _addUserEventCommand;
public DelegateCommand AddUserEventCommand
{
get { return _addUserEventCommand; }
set
{
_addUserEventCommand = value;
OnPropertyChanged("AddUserEventCommand");
}
}
/// Bind with User Update in Grid Row
private DelegateCommand _updateUserEventCommand;
public DelegateCommand UpdateUserEventCommand {
get { return _updateUserEventCommand; }
set {
_updateUserEventCommand = value;
OnPropertyChanged("UpdateUserEventCommand");
}
}
......
}
如何解决?
答案 0 :(得分:2)
最后,我越来越多地阅读Call Stack。
作为我的ViewModel&amp;视图绑定是构造函数注入,因此StaticResource不是我的解决方案。我需要找到Ancestral DataContext来获取我的命令绑定。 所以我喜欢这样:
<telerik:RadButton Command="{Binding DataContext.AddUserEventCommand , RelativeSource={RelativeSource AncestorType=UserControl}}"
Background="Green" Foreground="WhiteSmoke" FontSize="14" Padding="10,5,10,5">
<Image Source="../../Assets/Images/icon_user_add.png"
Cursor="Hand" Stretch="None" Width="32" Height="32"/>
</telerik:RadButton>
这样Button按照父DataContext绑定并且Command开始工作。