所以我遇到了试图实现MVVM的问题。 AFAIK是在ViewModel类中执行方法的最佳方法是通过CommandBinding。
<Button Command={Binding DoSomethingCommand} />
只有这次我需要对ListBoxItem进行双击,ListBoxItem不实现ICommandSource。所以我想知道如果有的话,最好的方法是什么。
谢谢!
编辑:
我只是想到了一种方式,但它似乎相当hacky。如果我公开ListBox.DoubleClick事件,我的ViewModel类订阅它并在触发DoubleClick时运行正确的方法该怎么办?
答案 0 :(得分:5)
您可以在代码隐藏文件中处理该事件,并在ViewModel对象上调用该方法。在我看来,这比开始破解要好得多。 :-)我不会将WPF路由事件传递给ViewModel对象。
谁说禁止使用代码隐藏?模型 - 视图 - ViewModel模式绝对不是。
答案 1 :(得分:2)
您可以使用附加行为。
答案 2 :(得分:0)
Silverlight不包含像WPF中的Button那样的Command按钮。我们解决它的方法是创建一个包含命令的自定义控件,并将该事件映射到命令。这样的事情应该有效。
public class CommandListBoxItem : ListBoxItem
{
public CommandListBoxItem()
{
DoubleClick += (sender, e) =>
{
if (Command != null && Command.CanExecute(CommandParameter))
Command.Execute(CommandParameter);
};
}
#region Bindable Command Properties
public static DependencyProperty DoubleClickCommandProperty =
DependencyProperty.Register("DoubleClickCommand",
typeof(ICommand), typeof(CommandListBoxItem),
new PropertyMetadata(null, DoubleClickCommandChanged));
private static void DoubleClickCommandChanged(DependencyObject source, DependencyPropertyChangedEventArgs args)
{
var item = source as CommandListBoxItem;
if (item == null) return;
item.RegisterCommand(args.OldValue as ICommand, args.NewValue as ICommand);
}
public ICommand DoubleClickCommand
{
get { return GetValue(DoubleClickCommandProperty) as ICommand; }
set { SetValue(DoubleClickCommandProperty, value); }
}
public static DependencyProperty DoubleClickCommandParameterProperty =
DependencyProperty.Register("DoubleClickCommandParameter",
typeof(object), typeof(CommandListBoxItem),
new PropertyMetadata(null));
public object DoubleClickCommandParameter
{
get { return GetValue(DoubleClickCommandParameterProperty); }
set { SetValue(DoubleClickCommandParameterProperty, value); }
}
#endregion
private void RegisterCommand(ICommand oldCommand, ICommand newCommand)
{
if (oldCommand != null)
oldCommand.CanExecuteChanged -= HandleCanExecuteChanged;
if (newCommand != null)
newCommand.CanExecuteChanged += HandleCanExecuteChanged;
HandleCanExecuteChanged(newCommand, EventArgs.Empty);
}
private void HandleCanExecuteChanged(object sender, EventArgs args)
{
if (DoubleClickCommand != null)
IsEnabled = DoubleClickCommand.CanExecute(DoubleClickCommandParameter);
}
}
然后在创建ListBoxItems时绑定到新的Command Property。
<local:CommandListBoxItem DoubleClickCommand="{Binding ItemDoubleClickedCommand}" />