C# menuflyout选择了传递给命令mvvm的项

C# menuflyout选择了传递给命令mvvm的项,c#,xaml,mvvm,windows-store-apps,prism,C#,Xaml,Mvvm,Windows Store Apps,Prism,我正在尝试将listview中choosen项的menuflyoutitem绑定到Delete命令。弹出菜单在我按住列表中的元素时显示,所以我无法将其绑定到viewmodel中的SelectedItem属性 SelectedItem属性工作正常,但我必须先点击元素,然后按住该项以显示菜单,然后再删除。如何在viewmodel中将发件人从保留传递到我的属性 视图: 和我的ViewModel: public class AllListsPageViewModel : Microsoft.Practi

我正在尝试将listview中choosen项的menuflyoutitem绑定到Delete命令。弹出菜单在我按住列表中的元素时显示,所以我无法将其绑定到viewmodel中的SelectedItem属性

SelectedItem属性工作正常,但我必须先点击元素,然后按住该项以显示菜单,然后再删除。如何在viewmodel中将发件人从保留传递到我的属性

视图:

和我的ViewModel:

public class AllListsPageViewModel : Microsoft.Practices.Prism.Mvvm.ViewModel, Interfaces.IAllListsPageViewModel
{
    #region Fields

    private ObservableCollection<EntryList> _allMyLists;
    private EntryList _selectedList;

    private DelegateCommand _addEntryListCommand;
    private DelegateCommand _deleteEntryListCommand;

    private readonly INavigationService _navigationService;
    #endregion //Fields

    #region Construction

    public AllListsPageViewModel(INavigationService navigationService) { ... }
    #endregion //Construction

    #region Properties

    public ObservableCollection<EntryList> AllMyLists
    {
        get { return _allMyLists; }
        set { SetProperty(ref _allMyLists, value); }
    }

    public EntryList SelectedList
    {
        get { return _selectedList; }
        set { SetProperty(ref _selectedList, value); }
    }
    #endregion //Properties

    #region Methods

    private void loadData() { }

    private bool _canAddEntryList() { return true; }

    private void _addEntryList() { ... }

    private bool _canDeleteEntryList() { ... }

    private void _deleteEntryList()
    {
        //How to get sender from holding event here?
        _allMyLists.Remove(_selectedList);
    }
    #endregion //Methods

    #region Commands

    public ICommand AddEntryListCommand { ... }

    public ICommand DeleteEntryListCommand
    {
        get
        {
            if (_deleteEntryListCommand == null)
            {
                _deleteEntryListCommand = new DelegateCommand(_deleteEntryList, _canDeleteEntryList);
            }
            return _deleteEntryListCommand;
        }
    }
    #endregion //Commands
}
public类AllListsPageViewModel:Microsoft.Practices.Prism.Mvvm.ViewModel,Interfaces.iallistspageviewmodel
{
#区域字段
私人可观察收集所有列表;
私有入口列表_selectedList;
专用DelegateCommand _AddEntryList命令;
私有DelegateCommand _deleteEntryListCommand;
私有只读INavigationService(导航服务);
#endregion//字段
#区域建设
public AllListsPageViewModel(INavigationService导航服务){…}
#端域//构造
#区域属性
公共可观测集合所有列表
{
获取{return\u allmylist;}
set{SetProperty(ref _allmylist,value);}
}
公共条目列表SelectedList
{
获取{return\u selectedList;}
set{SetProperty(ref _selectedList,value);}
}
#endregion//属性
#区域方法
私有void loadData(){}
private bool\u canadadentrylist(){return true;}
私有void_addEntryList(){…}
私有bool_candeleteintrylist(){…}
私有void_deleteEntryList()
{
//如何从此处举行的活动中获取发件人?
_所有列表。删除(\u selectedList);
}
#endregion//方法
#区域命令
公共ICommand AddEntryList命令{…}
public ICommand deleteentrylist命令
{
得到
{
如果(_deleteEntryListCommand==null)
{
_deleteEntryListCommand=新的DelegateCommand(_deleteEntryList,_CandeletEntryList);
}
返回deleteEntryListCommand;
}
}
#endregion//命令
}

提前感谢。

我今天遇到了同样的问题,我已解决如下问题:

namespace your.namespace
{
    using Microsoft.Xaml.Interactivity;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Input;

    public class OpenMenuFlyoutAction : DependencyObject, IAction
    {
        private static object holdedObject;

        public object Execute(object sender, object parameter)
        {
            FrameworkElement senderElement = sender as FrameworkElement;
            FlyoutBase flyoutBase = FlyoutBase.GetAttachedFlyout(senderElement);
            flyoutBase.ShowAt(senderElement);

            var eventArgs = parameter as HoldingRoutedEventArgs;
            if (eventArgs == null)
            {
                return null;
            }

            var element = eventArgs.OriginalSource as FrameworkElement;
            if (element != null)
            {
                HoldedObject = element.DataContext;
            }

            return null;
        }

        public static object HoldedObject
        {
            get { return holdedObject; }
            set
            {
                holdedObject = value;
            }
        }
    }
}
var foo = OpenMenuFlyoutAction.HoldedObject as Foo;
然后,您可以按如下方式访问该对象:

namespace your.namespace
{
    using Microsoft.Xaml.Interactivity;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Input;

    public class OpenMenuFlyoutAction : DependencyObject, IAction
    {
        private static object holdedObject;

        public object Execute(object sender, object parameter)
        {
            FrameworkElement senderElement = sender as FrameworkElement;
            FlyoutBase flyoutBase = FlyoutBase.GetAttachedFlyout(senderElement);
            flyoutBase.ShowAt(senderElement);

            var eventArgs = parameter as HoldingRoutedEventArgs;
            if (eventArgs == null)
            {
                return null;
            }

            var element = eventArgs.OriginalSource as FrameworkElement;
            if (element != null)
            {
                HoldedObject = element.DataContext;
            }

            return null;
        }

        public static object HoldedObject
        {
            get { return holdedObject; }
            set
            {
                holdedObject = value;
            }
        }
    }
}
var foo = OpenMenuFlyoutAction.HoldedObject as Foo;
我认为这是一个不错的解决方案,HoldeObject是静态的,因为您不能同时保存两个项目