WPF:如何使用MVVM将命令绑定到ListBoxItem?
我刚开始学习MVVM。我通过遵循这个MVVM教程从头开始制作应用程序(我强烈推荐给所有MVVM初学者)。基本上,我到目前为止创建的是一些文本框,其中用户添加他或她的数据,一个按钮来保存该数据,随后使用所有条目填充ListBox。
这就是我陷入困境的地方:我希望能够双击ListBoxItem并触发我创建并添加到ViewModel的命令。我不知道如何完成XAML方面,即我不知道如何将该命令绑定到ListBox(Item)。
这是XAML:
...
<ListBox
Name="EntriesListBox"
Width="228"
Height="208"
Margin="138,12,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
ItemsSource="{Binding Entries}" />
...
这是ViewModel:
public class MainWindowViewModel : DependencyObject
{
...
public IEntriesProvider Entries
{
get { return entries; }
}
private IEntriesProvider entries;
public OpenEntryCommand OpenEntryCmd { get; set; }
public MainWindowViewModel(IEntriesProvider source)
{
this.entries = source;
...
this.OpenEntryCmd = new OpenEntryCommand(this);
}
...
}
最后,这是我想在用户双击EntriesListBox中的项目后执行的OpenEntryCommand:
public class OpenEntryCommand : ICommand
{
private MainWindowViewModel viewModel;
public OpenEntryCommand(MainWindowViewModel viewModel)
{
this.viewModel = viewModel;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
return parameter is Entry;
}
public void Execute(object parameter)
{
string messageFormat = "Subject: {0}nStart: {1}nEnd: {2}";
Entry entry = parameter as Entry;
string message = string.Format(messageFormat,
entry.Subject,
entry.StartDate.ToShortDateString(),
entry.EndDate.ToShortDateString());
MessageBox.Show(message, "Appointment");
}
}
请帮忙,我很感激。
没有找到相关结果
已邀请:
4 个回复
镀建啼
派生控件才有可能将
对象绑定到它们的
属性(对于
事件)。 但是,您可以使用Blend提供的API将事件(例如
中的情况
)映射到
对象。
你必须定义:
并引用
。 - 编辑 - 这是WPF4的一部分,但如果您不使用WPF4,则可以使用Microsoft.Windows.Interactivity。这个dll来自Blend SDK,它不需要Blend,从这里: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=f1ae9a30-4928-411d-970b-e682ab179e17&displaylang=en 更新:我找到了一些可以帮到你的东西。检查MVVM Light Toolkit上的这个链接,其中包含有关如何执行此操作的演练,以及指向所需库的链接。 MVVM Light Toolkit是一个非常有趣的框架,用于将MVVM应用于Silverlight,WPF和WP7。 希望这可以帮助 :)
俯乡骚钵皆
现在,在ListBox项的DataTemplate中,使用以下内容:
ElementName绑定允许您从ViewModel的上下文中解析OpenEntryCmd,而不是特定的数据项。
惜堡沁戚
CommandControl.xaml:
用法:
内容可以是任何内容,当单击控件时,它将执行命令。 编辑:添加
到UserControl以启用控件的整个区域上的单击事件。
席陋临拈
没有填满整个容器,当你在空的
区域双击(或你的触发器是什么)时,这还有一个额外的好处就是不会触发命令。 基本上,只为你的
创建一个
,它由
组成,并将
的宽度绑定到
的宽度,将边距和填充设置为0,并禁用水平滚动(因为
会在可见光之外出血)
的边界触发水平滚动条否则)。我发现的唯一错误是,如果用户精确点击
的边框,命令将不会触发,我可以使用它。 这是一个例子: