2016-03-31 13 views
0

私はlistviewの選択された項目のmenuflyoutitemをDeleteコマンドにバインドしようとしています。 Flyoutmenuは、リストの要素を保持しているときに表示するので、viewmodelのSelectedItemプロパティにバインドすることはできません。menuflyout選択された項目がコマンドmvvmに渡されます

SelectedItemプロパティは正常に機能しますが、まず要素をタップしてから、メニューを表示してアイテムを保持してから削除する必要があります。 ViewModelで保留から送信者を自分の所有物に渡すにはどうすればよいですか?

ビュー:flyoutMenuを示すために使用のための

<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 
} 

感謝。

答えて

0

今日は同じ問題を抱えていたし、次のように私が解決した:

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が悪い解決策ではないと思います2つのアイテムを同時に保持することはできないので、静的です。

関連する問題