最后说明 在另一篇文章中找到的最终解决方案
尽管我很欣赏所提供的澄清,但最终的解决方案实际上是由上面链接的另一个解决方案提供的。无论我尝试了什么,通过“元素名称”组件的绑定都不起作用。我必须基于数据网格上的“相对”层次结构......
<Button Name="btnPrintReport"
Command="{Binding DataContext.MyPrintCommand,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type DataGrid}}}"
CommandParameter="{Binding}"
Height="16" Width="16" HorizontalAlignment="Center" >
<Image Source="MyButtonImage.png" IsHitTestVisible="True"/>
</Button>
希望在 WPF / MVVM 环境中不要太复杂。这是场景。
我有一个窗口 (.xaml) 和一个相应的视图模型 (.cs)。表单显示良好,所有数据绑定都没有问题。(注意:这不是通过任何商业“框架”完成的)
视图窗口中的控件之一是数据网格的自定义用户控件,其中包含所有预定义的列、标题和在显示视图时显示的内容。即使控件不是直接在主窗口 .xaml 文件中“定义”,而只是作为用户控件本身(它有自己明显的 .cs 代码隐藏)放在表单上,这也没有问题。
主窗口的“DataContext”指向视图模型,用户控件具有数据网格
<DataGrid AutoGenerateColumns="False"
Name="dataMyStuff"
ItemsSource="{Binding Path=MyTablePropertyOnViewModel,
NotifyOnSourceUpdated=True,
NotifyOnTargetUpdated=True}" ... />
现在,我在寻找什么。在这个数据网格上,我有一列在第一列中有一个图像。当我单击此图像时,我想打印此行表示的特定于记录的报告(它具有我使用的 PK 值)。那么,我如何告诉图像“KeyUp”事件转到 View Model 事件处理程序,因为这是数据所在的位置,以及我需要一些其他方法来准备对报告的调用。网格的视图部分用于向用户显示外观,因此在此控件中没有直接的“功能”。
-- 编辑 -- 每个答案的进展
我已经根据 Josh 和 Rachel 的评论调整了我的数据网格,但是,有些事情似乎仍然不太正确......看到按钮使用“命令”实例,我将其解释为它需要附加到我的视图模型上的“ICommand”接口对象。所以,我创建了一个实例。我知道命令处理程序可以工作,因为它也用于添加、编辑、保存、取消、退出等常见的事情......所以我有一个新的用于打印目的。为简单起见,我将它创建为始终执行,因此没有方法可以处理控件的“CanExecute”部分。我已经将按钮的“命令”设置为几乎所有我能想到的迭代,但这里是我所看到的更新。
<UserControl>
<Data grid columns / template, etc to the button>
<DataTemplate>
<Button Name="btnPrintReport"
Command="{Binding DataContext.MyPrintCommand}" >
<Image Source="myPrintImage.png"/>
</Button>
</DataTemplate>
</Data grid columns, etc>
</UserControl>
在我的 ViewModel 类中(myICommandButtonHandler 继承自 ICommand)
private myICommandButtonHandler myPrintCommand;
public myICommandButtonHandler MyPrintCommand
{
get { if (myPrintCommand == null)
myPrintCommand = new myICommandButtonHandler(myPrint);
return myPrintCommand;
}
}
private void myPrint()
{
MessageBox.Show( "Doing the print job..." );
}
现在,我所看到的。在逐步初始化所有控件等期间。我单击菜单项以调用要显示的窗口。首先,它创建一个 View Model 控制器的实例。然后,它调用 Window 并将 View Model 控制器作为参数传递,因此它立即在 Window 级别设置为窗口的“DataContext”。然后主窗口进入它的“InitializeComponents”调用并开始构建嵌入的所有其他控件,包括包含相关数据网格的这个单独的类。在此用户控件(具有数据网格)的构造函数中,尚未设置“数据上下文”,因为其余控件尚未初始化,我不知道为什么/何时“绑定”显然得到“迷上了”。所以,似乎尝试绑定到数据网格的命令按钮失败了。但是,在运行时,实际数据会在网格中更新,所以我知道有很多工作。
因此,数据网格将其“ItemsSource”设置为视图模型上“DataView”属性的属性,但“按钮”的绑定似乎没有看到我认为会得到的“MyPrintCommand”处理程序hit.. 它的作用是只显示一个消息框(现在)。