附加行为以执行ListViewItem的命令
当用户双击列表项时,我试图使用附加行为在我的ViewModel中执行命令。
我已经回顾了很多关于这个主题的文章,并尝试创建一个简单的测试应用程序,但我仍然遇到问题,例如。 使用MVVM从WPF ListView项目中点击双击事件
我的简单测试ViewModel有2个集合,一个返回字符串列表,另一个返回ListViewItem类型列表
public class ViewModel { public ViewModel() { Stuff = new ObservableCollection { new ListViewItem { Content = "item 1" }, new ListViewItem { Content = "item 2" } }; StringStuff = new ObservableCollection { "item 1", "item 2" }; } public ObservableCollection Stuff { get; set; } public ObservableCollection StringStuff { get; set; } public ICommand Foo { get { return new DelegateCommand(this.DoSomeAction); } } private void DoSomeAction() { MessageBox.Show("Command Triggered"); } }
这是附加的属性,就像你看到的其他例子:
public class ClickBehavior { public static DependencyProperty DoubleClickCommandProperty = DependencyProperty.RegisterAttached("DoubleClick", typeof(ICommand), typeof(ClickBehavior), new FrameworkPropertyMetadata(null, new PropertyChangedCallback(ClickBehavior.DoubleClickChanged))); public static void SetDoubleClick(DependencyObject target, ICommand value) { target.SetValue(ClickBehavior.DoubleClickCommandProperty, value); } public static ICommand GetDoubleClick(DependencyObject target) { return (ICommand)target.GetValue(DoubleClickCommandProperty); } private static void DoubleClickChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) { ListViewItem element = target as ListViewItem; if (element != null) { if ((e.NewValue != null) && (e.OldValue == null)) { element.MouseDoubleClick += element_MouseDoubleClick; } else if ((e.NewValue == null) && (e.OldValue != null)) { element.MouseDoubleClick -= element_MouseDoubleClick; } } } static void element_MouseDoubleClick(object sender, MouseButtonEventArgs e) { UIElement element = (UIElement)sender; ICommand command = (ICommand)element.GetValue(ClickBehavior.DoubleClickCommandProperty); command.Execute(null); } }
在我的主窗口中,我定义了设置附加行为并绑定到Foo命令的样式
定义ListViewItems时工作正常:
这也适用于绑定到ListViewItem类型的列表:
但这不是:
在输出窗口中,您会看到错误,但发现很难理解错误。
System.Windows.Data错误:39:BindingExpression路径错误:’object”’String’上找不到’Foo’属性(HashCode = 785742638)’。 BindingExpression:路径=富; DataItem =’String’(HashCode = 785742638); target元素是’ListViewItem’(Name =”); target属性为’DoubleClick’(类型’ICommand’)
所以我的问题是:当你将ListView绑定到Model对象列表时,如何才能将Command正确连接到每个ListViewItem?
谢谢。
问题是Binding
的DataContext
是字符串。 由于字符串类没有Foo
属性,因此出现错误。 在其他情况下不会发生这种情况,因为它们从父级inheritance了它们的DataContext
(对于数据项自动生成的容器不会发生这种情况 – 它们的DataContext
是数据项)。
如果您更改绑定以使用父ListView
的DataContext
,它应该工作正常:
Value="{Binding DataContext.Foo, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"