2016-03-31 8 views
0

Ich versuche, meneflyoutitem des gewählten Eintrags in listview an Delete Command zu binden. Das Flyout-Menü wird angezeigt, wenn ich das Element in der Liste halte, also kann ich es nicht an die SelectedItem-Eigenschaft in Viewmodel binden.menurflyout chosed item Übergabe an Befehl mvvm

SelectedItem Eigenschaft funktioniert gut, aber ich muss Element zuerst tippen und halten Sie dann Element zum Anzeigen von Menü und dann löschen. Wie kann ich Absender von Holding zu meiner Eigenschaft in Viewmodel übergeben?

Ausblick:

<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 für für die Ansicht flyoutMenu verwendet:

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

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

Vielen Dank im Voraus.

Antwort

0

Ich hatte das gleiche Problem heute und ich beschlossen haben, wie folgt:

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

Dann sind Sie auf das Objekt zugreifen können wie folgt:

var foo = OpenMenuFlyoutAction.HoldedObject as Foo; 

Ich denke, es ist nicht schlecht Lösung, die die HoldedObject ist statisch, da Sie nicht zwei Objekte gleichzeitig halten können.

Verwandte Themen