这是我无法得到的。如果我有一个profile.xaml页面,我有一个带有用户实例的ProfileViewModel。如何通过User属性告诉ProfileViewModel加载具有我想要的ID的用户?
我的意思是:当我点击另一个页面中的按钮打开该页面时,如何将用户标识传递给profileviewmodel?
For Instance
Userlist.xaml有一个用户列表。单击一个并加载Profile.Xaml的实例,但如何将userId传递给viewmodel?我不需要在profile.xaml中使用一些dependencyproperty然后传递它吗?
请告诉我这是否对您有意义:))
答案 0 :(得分:2)
这里有多种选择。
如果您在“父”ViewModel中工作,则可以使用特定用户ID构建新的ProfileViewModel,并将其设置为View直接拾取的属性。这是我在MVVM article中使用的方法。
或者,如果您有一个ProfileViewModel(和ProfileView)并且它没有“连接”到您直接选择用户的屏幕/视图,则最佳选择通常是使用某种形式的消息服务。这是MVVM Light使用的方法。
答案 1 :(得分:2)
您应该考虑将Userlist.xaml中的用户列表绑定到ProfileViewModel实例的集合,然后您可以将特定的ProfileViewModel提供给profile.xaml。
在此示例中,您的Userlist.xaml将包含:
<UserControl Name="userView">
<!-- other stuff -->
<ItemsControl ItemsSource={Binding Users}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding UserName}" />
<Button Content="View User Profile"
Command="{Binding ElementName=userView, Path=DataContext.ViewUserProfileCommand}"
CommandParameter="{Binding}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<!-- other stuff -->
</UserControl>
您的UserlistViewModel将包括:
#region Users Property
public const string UsersPropertyName = "Users";
private ObservableCollection<IProfileViewModelViewModel> _users;
public ObservableCollection<IProfileViewModelViewModel> Users
{
get { return _users; }
set
{
if (_users == value)
return;
_users = value;
RaisePropertyChanged(UsersPropertyName);
}
}
#endregion
public RelayCommand<IProfileViewModel> ViewUserProfileCommand
= new RelayCommand<IProfileViewModel>(ViewUserProfileCommandExecute);
private void ViewUserProfileCommandExecute(IUserProfileViewModel userProfileViewModel)
{
// display your profile view here
}
正如里德所提到的,将用户个人资料视图模型传递到其他网页的一种方法是MVVM Light Toolkit's messaging。