发送带有命令参数的对象

本文关键字:参数 对象 命令 | 更新日期: 2023-09-27 18:16:05

我使用PRISM使用MVVM设计模式开发我的Windows Phone应用程序。我需要将我的SelectedItem对象从我的LongListSelector通过我的delegate命令传递到我的方法。

我可以那样做。问题是,我传入了错误的对象。我不知道这是设计问题还是绑定错误。

我需要对象是一个Album对象。我得到的不是null就是我的ViewModel。(我已经修改了几次代码,这些是我唯一能得到的东西。)

XAML

<phone:LongListSelector x:Name="AlbumList" ItemsSource="{Binding Albums}"
                 Margin="10,0,0,0" LayoutMode="Grid" GridCellSize="200, 200"
                 ItemTemplate="{StaticResource AlbumTemplate}"
                                toolkit:TiltEffect.IsTiltEnabled="True"
                                >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged">
                    <i:InvokeCommandAction Command="{Binding DataContext.SelectAlbumCommand, ElementName=ContentPanel}"
                                        CommandParameter="{Binding}"/>   
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </phone:LongListSelector>

视图模型

private ObservableCollection<Album> _albums;
    public ObservableCollection<Album> Albums
    {
        get { return _albums; }
        set
        {
            if (value != null)
            {
                _albums = value;
                NotifyPropertyChanged();
            }
        }
    }
    private Album _selectedAlbum;
    public Album SelectedAlbum
    {
        get { return _selectedAlbum; }
       // code removed as it is not needed; the object is null when trying to set.
}
        public void AlbumSelected(object p)
    {
        App.Dispatcher.BeginInvoke(() =>
            {
                SelectedAlbum = (Album)p;
            });
        ////Navigate("/Views/PhotosListPage.xaml");
    }
//command that takes an object as parameter.
            _selectAlbumCommand = new DelegateCommand<object>(this.AlbumSelected);

发送带有命令参数的对象

如果您只想通过SelectAlbumCommand设置SelectedAlbum,为什么不尝试将SelectedItem绑定到SelectedAlbum呢?

<phone:LongListSelector x:Name="AlbumList" ItemsSource="{Binding Albums}" 
 SelectedItem="{Binding SelectedAlbum}" />

如果您真的想将SelectedItem传递给SelectedAlbumCommand(出于其他原因),您应该将CommandParameter绑定到LongListSelectorSelectedItem

 <i:InvokeCommandAction Command="{Binding DataContext.SelectAlbumCommand, ElementName=ContentPanel}" CommandParameter="{Binding ElementName=AlbumList, Path=SelectedItem}"/>   

显然,您不能为此使用LongListSelector。我不得不把它改成一个列表框,它工作得很好。

如果我更努力地搜索,我就会发现:如何使用mvvm模式在LongListSelector中选择一个项目?

WP8 LongListSelector SelectedItem not bindable