【发布时间】:2017-10-03 21:17:23
【问题描述】:
我想知道从内部列表项中触发外部函数(或命令)的最佳方法是什么。
例如,我有一个 FooManager 对象,它包含一个名为 MyFoos 的 Foo 对象的 ObservableCollection。 FooManager 还有一个函数叫ProcessFoo(Foo foo)。
<StackPanel DataContext="FooManager">
<ListView ItemsSource="{Binding MyFoos}" >
<ListView.ItemTemplate>
<DataTemplate>
<WrapPanel>
<Button Content="Do Something"
Command="{Binding Path=SomeFooCommand} />
</WrapPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
如何通过单击“做某事”按钮来触发 ProcessFoo(Foo foo) 函数(并传递“点击”的 Foo)?
我意识到我可以使用代码隐藏来执行此操作,但我想知道最干净的 MVVM 方法是什么。 Foo 的 ViewModel 是否应该包含对其 FooManager 的引用,或者 ViewModel 相互引用是不好的做法?
【问题讨论】:
-
绑定到ListView的DataContext:
Command="{Binding Path=DataContext.SomeFooCommand, RelativeSource={RelativeSource AncestorType=ListView}}" -
在这种情况下,将 Foo 本身作为 CommandParameter 传递是否正确?
-
在哪种意义上正确?如果命令需要访问当前项目,您当然可以将当前 Foo 实例作为命令参数传递。
-
抱歉 - “正确”与“最佳实践”相同。感谢您的帮助@Clemens!
标签: c# wpf mvvm data-binding icommand