将特定ID传递给MVVM

时间:2010-06-18 18:05:34

标签: silverlight mvvm

这是我无法得到的。如果我有一个profile.xaml页面,我有一个带有用户实例的ProfileViewModel。如何通过User属性告诉ProfileViewModel加载具有我想要的ID的用户?

我的意思是:当我点击另一个页面中的按钮打开该页面时,如何将用户标识传递给profileviewmodel?

For Instance

Userlist.xaml有一个用户列表。单击一个并加载Profile.Xaml的实例,但如何将userId传递给viewmodel?我不需要在profile.xaml中使用一些dependencyproperty然后传递它吗?

请告诉我这是否对您有意义:))

2 个答案:

答案 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