从ListItem内部触发外部ICommands / Functions

时间:2017-10-03 21:17:23

标签: c# wpf mvvm data-binding icommand

我想知道从内部列表项中触发外部函数(或命令)的最佳方法是什么。

例如,我有一个j对象,其中包含名为FooManager的{​​{1}}个对象的ObservableCollection。 FooManager还有一个名为Foo的函数。

MyFoos

如何点击“Do Something”按钮触发ProcessFoo(Foo foo)功能(并传递'clicked'Foo)?

我意识到我可以使用代码隐藏来做到这一点,但我想知道什么是最干净的MVVM方法。 ViewModel for Foo是否包含对它的FooManager的引用,或者ViewModel是否相互引用是不好的做法?

2 个答案:

答案 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构造函数。