【发布时间】:2016-09-28 14:16:28
【问题描述】:
我有一个带有ListBox 的窗口,它绑定到List<MyThing> 的一个实例。类MyThing 包含一个属性Name,它显示在ListBox 中。
我也有一个Button,我想在点击的时候运行下面的方法:
void RunMe(MyThing m) { ... }
我想使用ListBox 中的SelectedItem 作为此方法的参数。
我该怎么做?
这是我的 MyWindow 类的 XAML 文件:
<Window x:Class="MyProject.MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<ListBox x:Name="lb" ItemsSource="{Binding MyThingList}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Content="Run command!" Command="{Binding RunCommand}"/>
</StackPanel>
</Window>
MyWindow 的DataContext 设置为MyVM 的实例,定义如下。
此 XAML 的代码隐藏除 InitializeComponent 外为空。
这是我的 ViewModel 类MyVM:
public class MyVM
{
public IList<MyThing> MyThingList { get; private set; }
public MyVM(IList<MyThing> aThingList)
{
MyThingList = aThingList;
RunCommand = // somehow connect it to method "RunMe"
}
public void RunMe(MyThing m) { ... }
public ICommand RunCommand { get; private set; }
}
正如各位经验丰富的人所见,我真的不知道自己在做什么。所以这里有一些具体的问题:
为什么我不能简单地将按钮绑定到任何在我单击时调用的 METHOD?为什么必须是命令,有什么好处? (我知道一个命令可以自动跟踪它的可执行性,当它无法执行时将按钮变灰,但现在我不关心这个。我也知道它可以绑定到一个事件,但似乎此事件必须在代码隐藏中定义,我想保留为空。如果我错了,请纠正我。)
如何将我的
RunMe方法连接到MyVM的构造函数中的命令RunCommand? (我试过RunCommand = new RoutedUICommand("RunMe", "RunMe", typeof(MyVm));,但按钮是灰色的。我也试过typeOf(MyWindow)和typeof(Window),但它仍然是灰色的。)假设我得到了这个工作,因此单击按钮会导致调用方法
RunMe。如何将SelectedItem从ListBox交给RunMe方法? (我知道我可以把按钮的DataContext改成DataContext="{Binding Path=SelectedItem, ElementName=lb}",但是这样就可能找不到命令了,我还是不知道怎么让按钮把这个选中的项交给方法。)我的方法可能存在根本问题吗?我仍在尝试掌握任何东西(一般的 GUI 编程、事件/命令、WPF、MVVM 模式——这对我来说都是新的),所以如果你有更好的方法,请告诉我。
PS:请随意将标题更改为更具表现力的东西。我有很多问题,很难确定一个...
【问题讨论】:
-
"为什么我不能简单地将按钮绑定到任何我点击时调用的 METHOD?"因为
ICommand更加通用和强大。如果我是你,我会从某个地方窃取DelegateCommand实现并使用它。 MS Prism has one。 WPF 应该附带一个开箱即用的 DelegateCommand,恕我直言。这是他们真正的疏忽。 -
您通过将
CommandParameter绑定到Button.CommandParameter属性将其传递给命令。轻松愉快。 -
这就是构建 MVVM 框架的原因。如果您已经在使用一个 - 检查它的文档,您可能会找到满足您需求的东西。如果不使用 Caliburn.Micro 操作:caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions - 它们可以满足您的所有需求。
标签: c# wpf data-binding listbox command