C# wpf绑定事件或命令以在项数据上下文上运行

C# wpf绑定事件或命令以在项数据上下文上运行,c#,wpf,xaml,C#,Wpf,Xaml,我有一些WPF代码,看起来像这样 C# namespace ItemEventTest { 公共部分类主窗口:窗口 { 公共主窗口() { DataContext=this; MyItems=新的ObservableCollection(); 添加(新的MyItem{Name=“Otto”}); 添加(新的MyItem{Name=“Dag”}); 添加(新的MyItem{Name=“Karin”}); 初始化组件(); } 公共ObservableCollection MyItems{get;s

我有一些WPF代码,看起来像这样

C#

namespace ItemEventTest
{
公共部分类主窗口:窗口
{
公共主窗口()
{
DataContext=this;
MyItems=新的ObservableCollection();
添加(新的MyItem{Name=“Otto”});
添加(新的MyItem{Name=“Dag”});
添加(新的MyItem{Name=“Karin”});
初始化组件();
}
公共ObservableCollection MyItems{get;set;}
}
公共类MyItem:INotifyPropertyChanged
{
私有字符串m_name;
公共字符串名
{
获取{return m_name;}
设置
{
m_name=值;
OnPropertyChanged();
}
}
使用MoveMove()时公共无效
{
//做事
}
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}
}
Xaml


我现在想做的是,当鼠标移动到某个项目上时,在该项目的源对象上调用
WhenMove


我希望直接在对象上调用该函数,而不是首先通过
MainWindow
或连接到
MainWindow
的某个视图模型。感觉这应该是可能的,因为数据是以这种方式绑定的,但我还没有找到如何实现它的描述。

如果您正在寻求MVVM模式中的解决方案


编辑:添加对System.Windows.Interactivity dll的引用(如果安装了Blend或VS2015,则为系统定义)

然后添加以下名称空间
xmlns:i=“schemas.microsoft.com/expression/2010/interactivity‌​"

//xaml文件

<Grid>
        <ListBox ItemsSource="{Binding MyItems}">
            <ListBox.ItemTemplate>
                <DataTemplate DataType="local:MyItem">
                    <TextBlock Text="{Binding Name}">
                          <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseEnter">
                    <i:InvokeCommandAction Command="{Binding MouseHoveredItemChangedCommand}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
//RelayCommand类

 public class RelayCommand : ICommand
        {
            public event EventHandler CanExecuteChanged
            {
                add { CommandManager.RequerySuggested += value; }
                remove { CommandManager.RequerySuggested -= value; }
            }
            private Action methodToExecute;
            private Func<bool> canExecuteEvaluator;
            public RelayCommand(Action methodToExecute, Func<bool> canExecuteEvaluator)
            {
                this.methodToExecute = methodToExecute;
                this.canExecuteEvaluator = canExecuteEvaluator;
            }
            public RelayCommand(Action methodToExecute)
                : this(methodToExecute, null)
            {
            }
            public bool CanExecute(object parameter)
            {
                if (this.canExecuteEvaluator == null)
                {
                    return true;
                }
                else
                {
                    bool result = this.canExecuteEvaluator.Invoke();
                    return result;
                }
            }
            public void Execute(object parameter)
            {
                this.methodToExecute.Invoke();
            }
        }
公共类RelayCommand:ICommand
{
公共事件事件处理程序CanExecuteChanged
{
添加{CommandManager.RequerySuggested+=value;}
删除{CommandManager.RequerySuggested-=value;}
}
执行的私人行动方法;
私人Func canExecuteEvaluator;
公共RelayCommand(执行的操作方法,Func canExecuteEvaluator)
{
this.methodToExecute=methodToExecute;
this.canExecuteEvaluator=canExecuteEvaluator;
}
公共中继命令(执行的操作方法)
:此(methodToExecute,null)
{
}
公共布尔CanExecute(对象参数)
{
if(this.canExecuteEvaluator==null)
{
返回true;
}
其他的
{
bool result=this.canExecuteEvaluator.Invoke();
返回结果;
}
}
public void Execute(对象参数)
{
this.methodToExecute.Invoke();
}
}

如果您正在MVVM模式中寻找解决方案


编辑:添加对System.Windows.Interactivity dll的引用(如果安装了Blend或VS2015,则为系统定义)

然后添加以下名称空间
xmlns:i=“schemas.microsoft.com/expression/2010/interactivity‌​“

//xaml文件

<Grid>
        <ListBox ItemsSource="{Binding MyItems}">
            <ListBox.ItemTemplate>
                <DataTemplate DataType="local:MyItem">
                    <TextBlock Text="{Binding Name}">
                          <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseEnter">
                    <i:InvokeCommandAction Command="{Binding MouseHoveredItemChangedCommand}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
//RelayCommand类

 public class RelayCommand : ICommand
        {
            public event EventHandler CanExecuteChanged
            {
                add { CommandManager.RequerySuggested += value; }
                remove { CommandManager.RequerySuggested -= value; }
            }
            private Action methodToExecute;
            private Func<bool> canExecuteEvaluator;
            public RelayCommand(Action methodToExecute, Func<bool> canExecuteEvaluator)
            {
                this.methodToExecute = methodToExecute;
                this.canExecuteEvaluator = canExecuteEvaluator;
            }
            public RelayCommand(Action methodToExecute)
                : this(methodToExecute, null)
            {
            }
            public bool CanExecute(object parameter)
            {
                if (this.canExecuteEvaluator == null)
                {
                    return true;
                }
                else
                {
                    bool result = this.canExecuteEvaluator.Invoke();
                    return result;
                }
            }
            public void Execute(object parameter)
            {
                this.methodToExecute.Invoke();
            }
        }
公共类RelayCommand:ICommand
{
公共事件事件处理程序CanExecuteChanged
{
添加{CommandManager.RequerySuggested+=value;}
删除{CommandManager.RequerySuggested-=value;}
}
执行的私人行动方法;
私人Func canExecuteEvaluator;
公共RelayCommand(执行的操作方法,Func canExecuteEvaluator)
{
this.methodToExecute=methodToExecute;
this.canExecuteEvaluator=canExecuteEvaluator;
}
公共中继命令(执行的操作方法)
:此(methodToExecute,null)
{
}
公共布尔CanExecute(对象参数)
{
if(this.canExecuteEvaluator==null)
{
返回true;
}
其他的
{
bool result=this.canExecuteEvaluator.Invoke();
返回结果;
}
}
public void Execute(对象参数)
{
this.methodToExecute.Invoke();
}
}

可能重复的@Hampus让我理解。当鼠标进入控件时,你想做WhenMouseMove中包含的事情吗?@DanieleSartori否,当鼠标在ListBoxItem中移动时,你说的“不首先通过”是什么意思"? 您需要编写一些代码,在使用move方法时调用该调用。@mm8我试图不把代码弄得乱七八糟,或者如果我有一个模型视图,那么使用事件处理程序,找出触发事件的项的数据上下文,然后调用可能重复的@Hampus让我理解。当鼠标进入控件时,您想执行WhenMouseMove中包含的操作吗?@DanieleSartori否,当鼠标在ListBoxItem中移动时,您所说的“不首先通过”是什么意思?您需要编写一些代码,以便在使用move方法时调用该调用。@mm8我试图不让代码变得混乱,或者如果我有一个模型视图,则使用事件处理程序,找出触发事件的项的数据上下文,然后调用它,这可能会起作用,但我似乎无法做到
 public class RelayCommand : ICommand
        {
            public event EventHandler CanExecuteChanged
            {
                add { CommandManager.RequerySuggested += value; }
                remove { CommandManager.RequerySuggested -= value; }
            }
            private Action methodToExecute;
            private Func<bool> canExecuteEvaluator;
            public RelayCommand(Action methodToExecute, Func<bool> canExecuteEvaluator)
            {
                this.methodToExecute = methodToExecute;
                this.canExecuteEvaluator = canExecuteEvaluator;
            }
            public RelayCommand(Action methodToExecute)
                : this(methodToExecute, null)
            {
            }
            public bool CanExecute(object parameter)
            {
                if (this.canExecuteEvaluator == null)
                {
                    return true;
                }
                else
                {
                    bool result = this.canExecuteEvaluator.Invoke();
                    return result;
                }
            }
            public void Execute(object parameter)
            {
                this.methodToExecute.Invoke();
            }
        }