发送带有命令参数的对象
本文关键字:参数 对象 命令 | 更新日期: 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
绑定到LongListSelector
的SelectedItem
<i:InvokeCommandAction Command="{Binding DataContext.SelectAlbumCommand, ElementName=ContentPanel}" CommandParameter="{Binding ElementName=AlbumList, Path=SelectedItem}"/>
显然,您不能为此使用LongListSelector。我不得不把它改成一个列表框,它工作得很好。
如果我更努力地搜索,我就会发现:如何使用mvvm模式在LongListSelector中选择一个项目?
WP8 LongListSelector SelectedItem not bindable