我有ViewModel,它有一个ObservableCollection [Employee] EmpCol,现在ViewModel与我的View绑定,而EmpCol设置为自定义控件的ItemSource。该自定义控件生成带有网格的堆栈面板,如果EmpCol中有4个对象,则其中将有4个带有网格的堆栈面板。现在在这些网格中,我有一列按钮。 现在我的问题是我无法将datagrid中的Button的Command绑定到Employee类中的RelayCommand。
我正在使用MVVM light工具包,我发现了一种实际上可以提供绑定命令的完整路径的方法
<Button x:Name="myButton" Width="20" Height="15" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cmd:EventToCommand Command="{Binding Source={StaticResource VMLocator}, Path=MyVM.Employee.MyButtonCommand}" PassEventArgsToCommand="False"/> </i:EventTrigger>
</i:Interaction.Triggers>
</Button>
现在上面的方法有效,但在我的情况下,我没有Employee,而是Employee的集合,所以当我给这样的绑定路径 的路径= MyVM.EmpCol.MyButtonCommand
它不起作用。我搜索了很多,但找不到任何解决方案。 因此,我们非常感谢任何帮助以解决我的问题。
谢谢, 特立独行
命令绑定发生在 DataGrid 的一行内。
答案 0 :(得分:1)
tsolution取决于视图的结构,如果您有一个主详细信息视图,则应创建一个子结构,该子结构要求员工ViewModel作为DataContext并将其绑定到当前选定的员工。通过它,您可以获得正确的ViewModel视图。
如果您导航到新页面,最简单的方法可能是通过查看您要显示的员工的ID,然后在代码后面调用您查看模型的方法 - 您可以从DataContext propery获取该方法 - 从数据库或服务加载正确的员工。
或者,您可以将当前员工保留在应用程序范围内的可访问变量中。例如。应用程序类上的静态变量,存储在资源中的单例或静态类,或ViewLocator上的静态变量(在所有情况下,当未选择任何员工时,您可能必须提供空的员工ViewModel或阻止打开View。) / p>
修改强>:
如果ViewModel的集合绑定到DataGrid并且命令绑定有问题,这可能是一个可能的解决方案:
将命令放在包含Collection的ViewModel上(即绑定到DataGrid的ItemsSource的propety)。然后在此高级ViewModel上实现该命令。您现在可以使用RelativeSurce绑定通过DataGrid的父DataContext属性访问此更高级别的ViewModel。在您的按钮中,您现在可以绑定命令并将当前行的DataContext作为命令参数传递 - 该命令显然需要使用此参数。
编辑2 :
Forgot Silverlight不支持所有RelativeSource模式,但是,它支持绑定到命名元素,因此以下内容应该有效......
假设:
代码:
<DataGrid x:Name="dgEmployees" ItemsSource="{Binding Empoyees}" ...>
...
<Button x:Name="myButton" Width="20" Height="15" HorizontalAlignment="Center"
VerticalAlignment="Center" Margin="5" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cmd:EventToCommand
Command="{Binding ElementName=dgEmployees, Path=DataContext.MyButtonCommand}"
CommandParameter="{Binding}"
PassEventArgsToCommand="False"/>
</i:Interaction.Triggers>
</Button>
...
</DataGrid>
答案 1 :(得分:0)
最简单的方法是使用中继命令,例如
public RelayCommand SearchCommand
{
get
{
return new RelayCommand(GetData);//GetDatais a method for your action on click event
}
}
您可以在以下链接中看到详细信息
http://codenicely.blogspot.com/2012/01/handling-button-click-event-in.html