Button命令未绑定到DataGrid中的ViewModel

时间:2011-06-17 11:03:50

标签: silverlight mvvm binding command mvvm-light

我有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 的一行内。

2 个答案:

答案 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模式,但是,它支持绑定到命名元素,因此以下内容应该有效......

假设:

  1. 更高级别的ViewModel称为“EmployeeListViewModel”
  2. 它有一个名为Employees的属性,包含EmployeeViewModels列表
  3. 包含DataGrid的元素的DataContext设置为EmployeeListViewModel
  4. 代码:

    <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