我想知道从内部列表项中触发外部函数(或命令)的最佳方法是什么。
例如,我有一个j
对象,其中包含名为FooManager
的{{1}}个对象的ObservableCollection。 FooManager还有一个名为Foo
的函数。
MyFoos
如何点击“Do Something”按钮触发ProcessFoo(Foo foo)功能(并传递'clicked'Foo)?
我意识到我可以使用代码隐藏来做到这一点,但我想知道什么是最干净的MVVM方法。 ViewModel for Foo是否包含对它的FooManager的引用,或者ViewModel是否相互引用是不好的做法?
答案 0 :(得分:0)
感谢@Clemens。在FooManager类中,添加一个以Foo VM作为参数的命令。然后,数据模板中的Button可以通过在绑定中使用RelativeSource
并将其自身(空{Binding}
)作为参数传递来触发此操作。
<StackPanel DataContext="FooManager">
<ListView ItemsSource="{Binding MyFoos}" >
<ListView.ItemTemplate>
<DataTemplate>
<WrapPanel>
<Button Content="Do Something"
Command="{Binding Path=DataContext.ProcessFoo, RelativeSource={RelativeSource AncenstorType=ListView}}
CommandParameter={Binding} />
</WrapPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
答案 1 :(得分:-1)
我使用Prism的DelegateCommand,我认为这是绑定命令的最简单方法。它具有很多功能,还有许多其他命令选项。如果你有visual studio,请转到Tools&gt; NuGet包管理器&gt; Mange包,在Browse搜索Prism并安装Prism.Core。或者您可以创建自己的DelegateCommand实现ICommand接口。 delegatecommand的另一个选项位于本文的底部:https://www.codeproject.com/Articles/36545/WPF-MVVM-Model-View-View-Model-Simplified,它使用wpf mvvm工具包。这是一个棱镜实现:
view.xaml:
<Button Command="{Binding FooCommand}" />
viewmodel.cs:
public DelegateCommand FooCommand { get; private set; }
FooCommand = new DelegateCommand(OnFoo, CanFoo);
private void OnFoo()
{
ProcessFoo(ListViewName.SelectedItems);
}
private bool CanFoo()
{
return someBooleanFunc();
}
您可能希望将“FooCommand = new ...”移动到ViewModel构造函数。