Отправить FlipViewItem как RelayCommandParameter в приложении Магазина Windows

Я пытаюсь отправить в модель представления текущий элемент элемента управления FlipView, используя MVVM Light.

Код XAML, представляющий элемент управления FlipView, выглядит следующим образом:

<FlipView x:Name="mainFlipView" Margin="0,10,0,10" ItemsSource="{Binding AlbumItems, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
    <FlipView.ItemTemplate>
        <DataTemplate>
            <Grid Margin="5">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                        <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>

                <TextBlock Text="{Binding Caption}"
                       FontSize="23"
                       HorizontalAlignment="Center"
                       TextAlignment="Center"
                       TextWrapping="Wrap"
                       Margin="10"/>

                <ScrollViewer Grid.Row="1" ZoomMode="Enabled">
                    <uc:ImageViewer FilePath="{Binding ImagePath}" />
                </ScrollViewer>

                <TextBlock Text="{Binding NrOfVotes}" FontSize="20"
                       Grid.Row="2" HorizontalAlignment="Center"                           
                       Margin="10" />
             </Grid>
         </DataTemplate>
    </FlipView.ItemTemplate>
</FlipView>
...

Код XAML элемента, содержащего команду relay:

<Page.BottomAppBar>
    <CommandBar>
        <AppBarButton x:Name="appBarButtonDelete" Label="Delete" Icon="Delete" 
                      Command="{Binding DeleteItemCommand}"
                      CommandParameter="{Binding ElementName=mainFlipView, Path=SelectedItem}"/>
    </CommandBar>
</Page.BottomAppBar>

В ViewModel RelayCommand объявляется и используется следующим образом:

public class ResultsPageViewModel : ViewModelBase
{
    public RelayCommand<MyModel> DeleteItemCommand { get;  private set; }

    public ResultsPageViewModel()
    {
        this.DeleteItemCommand = new RelayCommand<MyModel>(post => DeleteItem(post));
    }

    public void DeleteItem(MyModel p)
    {
        //P is always null here...
    }
}

Проблема в том, что в DeleteItem функция, которую я всегда получаю параметр как null, Я попытался объявить RelayCommand как RelayCommand<object> но проблема сохраняется.

Я также попробовал "обходной" метод объявления MyModel привязываемое свойство и привязка его к FlipView. Это работает, но я хотел бы знать, что я делаю не так в этой ситуации.

Заранее спасибо!

1 ответ

Попробуйте другую стратегию: возьмите параметр непосредственно из ViewModel после правильной привязки.

XAML

<FlipView x:Name="mainFlipView" 
          Margin="0,10,0,10"
          ItemsSource="{Binding AlbumItems, Mode=TwoWay }"
          SelectedItem="{Binding AlbumSelectedItem, Mode=TwoWay}">

ViewModel

private MyModel albumSelectedItem;
public MyModel AlbumSelectedItem
{
    get
    {
        return albumSelectedItem;
    }

    set
    {
        if (value != null && albumSelectedItem != value)
        {
            albumSelectedItem = value;
            RaisePropertyChanged(() => AlbumSelectedItem);
        }
    }
}

public void DeleteItem(MyModel p)
{
    //P is always null here...
    var pp = AlbumSelectedItem;
}

Очевидно, что CommandParameter бесполезен.;-)

Другие вопросы по тегам