在一个列中的按钮,从中获取点击事件处理程序所在的行。
问题的出现原因是作者希望在按钮的点击事件处理程序中获取按钮所在的行的行号,但是作者不想使用命令,而是使用事件处理程序来实现。
解决方法是将行号绑定到按钮的CommandParameter属性,然后在代码中通过访问CommandParameter属性来获取行号。
具体实现如下:
private void Button_Click(object sender, RoutedEventArgs e) { object ID = ((Button)sender).CommandParameter; }
在这种方法中,虽然CommandParameter属性的使用可能不是其预期用途,但从语义上来说,它比使用Tag属性更有意义,而且比在事件处理程序中从绑定对象中检索行号更简单。如果您更喜欢使用命令,那么采用命令的方法也是可以的。
问题的原因是希望在按钮的点击事件处理程序中获取按钮所在的行。解决方法是在XAML中绑定按钮的命令参数DataContext,并通过RowActionCommand在每个行的视图模型中定义该命令。
具体实现如下:
在XAML中,按钮的Command属性绑定到RowActionCommand命令,CommandParameter属性绑定到按钮的DataContext,代码如下:
在命令的实现中,通过判断参数的类型来处理相应的逻辑,代码如下:
public void Execute(object parameter) { if (parameter is MyObject) { // 处理逻辑 } }
至于RowActionCommand应该在模型中还是在视图模型中定义,Šebesta表示应该在每个行的视图模型中定义该命令。
以上就是解决问题的原因和方法的文章。
问题的原因是希望在按钮的点击事件处理程序中获取该按钮所在的行数据对象,并使用该对象的ID属性。为了解决这个问题,可以使用数据绑定和命令(MVVM模式)。
首先,在按钮的点击事件处理程序中,可以通过将按钮的DataContext转换为行数据对象来获取该对象,并进行相应的操作。代码如下:
private void Button_Click(object sender, RoutedEventArgs e) { MyObject obj = ((FrameworkElement)sender).DataContext as MyObject; //Do whatever you wanted to do with MyObject.ID }
然而,更理想的方法是使用命令来处理这种情况,这符合MVVM模式的设计原则。可以在数据对象(ViewModel)中创建一个命令,并将该命令与按钮的Command属性绑定,这样就不需要在代码中处理按钮的点击事件。代码如下:
public class MyViewModel { public ICommand MyCommand { get; set; } public MyViewModel() { MyCommand = new RelayCommand(ExecuteMyCommand); } private void ExecuteMyCommand(object parameter) { MyObject obj = parameter as MyObject; //Do whatever you wanted to do with MyObject.ID } }
然而,使用命令的一个问题是需要将数据表格的选定项与视图模型的成员进行数据绑定,这样就很难将命令泛化到足够好的程度,以便用于删除按钮。如果希望在应用程序中删除几乎任何东西,可以创建一个删除按钮的模板列资源。