menuflyout 选择的项目传递给命令 mvvm

menuflyout choosed item passing to command mvvm

我正在尝试将列表视图中所选项目的 menuflyoutitem 绑定到删除命令。 Flyoutmenu 显示我在列表中持有元素的时间,因此我无法将其绑定到视图模型中的 SelectedItem 属性。

SelectedItem 属性 工作正常,但我必须先点击元素,然后按住项目以显示菜单,然后删除。我如何在视图模型中将发件人从 Holding 传递到我的 属性?

查看:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <TextBlock Grid.Row="0"
               Text="My List App"
               HorizontalAlignment="Center"
               Style="{ThemeResource HeaderTextBlockStyle}" />
    <ListView x:Name="myListView"
              Grid.Row="1"
              ItemsSource="{Binding AllMyLists}"
              SelectedItem="{Binding SelectedList, Mode=TwoWay}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <i:Interaction.Behaviors>
                        <core:EventTriggerBehavior EventName="Holding">
                            <controls:OpenMenuFlyoutAction />
                        </core:EventTriggerBehavior>
                    </i:Interaction.Behaviors>
                    <FlyoutBase.AttachedFlyout>
                        <MenuFlyout>
                            <MenuFlyoutItem Text="Delete"
                                            Command="{Binding ElementName=myListView, Path=DataContext.DeleteEntryListCommand}" />
                        </MenuFlyout>
                    </FlyoutBase.AttachedFlyout>
                    <TextBlock Text="{Binding Name}"
                               Style="{ThemeResource ListViewItemTextBlockStyle}" />
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

OpenMenuFlyoutAction 用于显示弹出菜单:

public class OpenMenuFlyoutAction : DependencyObject, IAction
{
    public object Execute(object sender, object parameter)
    {
        FlyoutBase.ShowAttachedFlyout((FrameworkElement)sender);
        return sender;
    }
}

还有我的 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
}

提前致谢。

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

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;

我认为 HoldedObject 是静态的是个不错的解决方案,因为您不能同时持有两个项目。