2011-12-28 137 views
2

我有一个包含telerik RadGridView的WPF用户控件。控件的数据上下文被设置为MyViewModel类的一个实例。 MyViewModel类具有一个类型为ObservableCollection的myRecords属性。所述RadGridView由此约束:WPF - 数据模板绑定到ViewModel,而不是单个记录

ItemsSource="{Binding myRecords}" 

在RadGridView我限定数量的列,其含有结合MyRecords的性质的DataTemplates的。这工作正常。

我添加了一个包含删除按钮的列。或者说,它包含一个DataTemplate,其中包含一个标记为“删除”的按钮。这是绑定到记录上定义的命令:

<telerik:GridViewColumn.CellTemplate> 
    <DataTemplate> 
     <Button 
       Command="{Binding deleteCommand}" 
       CommandParameter="{Binding}"> 
      <Label>Delete</Label> 
     </Button> 
    </DataTemplate> 
</telerik:GridViewColumn.CellTemplate> 

而且这工作正常。我在MyRecord上定义的ICommand属性执行。

但是这里的东西 - 那不是我想要这个代码的地方。我不想在MyRecord上运行方法,我想在MyViewModel上运行一个方法,将相应的MyRecord作为参数传递。上面的CommandParameter =“{Binding}”元素传递了适当的MyRecord,所以这个部分很好。但我一直无法弄清楚如何将按钮的命令绑定到MyViewModel对象上的ICommand,而不是MyRecord上。

我一直在玩RelativeSource和AncestorType,并没有得到任何。

帮助将不胜感激。

回答

0

一种可能的方法是使用ViewModel进行记录,它将包裹模型记录并包含ICommand引用。当初始化每个recordViewModel一个为每个记录

recordViewModel.deleteCommand = myViewModel.deleteCommand; 

其中recordViewModel和myViewModel是相应的类的实例。

这种方式当点击行中的删除按钮时,父DataContext中的deleteCommand将被执行。

更新:我发现了一个潜在的替代解决方案,在那里你绑定到不同的元素,让你不局限于你的项目的数据上下文,而使用你指定的任何元素的数据上下文。

Command="{Binding DataContext.MyCommand, ElementName=LayoutRoot}" 

参考:http://blog.kevindockx.com/post/MVVM-challenge-binding-to-a-command-from-inside-an-ItemsControl-DataTemplate.aspx

+0

我想我可以做到这一点。目前,我的MyRecord类是在一个不依赖于PresentationCore.dll的程序集中定义的,我想这样保留它。另一种方法是通过ObservableCollection填充包含MyRecords的包装类的实例,或者,也许我可以在ViewModel程序集中定义一个ExtensionMethod ... – 2011-12-28 03:13:01

0

你能做出这样使用FindAncestor,像这样:{Binding DataContext.DeleteCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}

我认为这将是一个更好的解决方案。

相关问题