2

我只是在玩 MVVM Light,我想我已经明白了,但我有一个问题。

我正在使用为我的数据库 (SQLCE) 生成类、映射等的 SQL Server CE 工具箱。其中一个表称为 Profile,我想将其用作我也可以绑定的属性。这是我的 ViewModel 代码

public class ProfileViewModel : ViewModelBase
{
    private Profile profile; // Profile is the class created by SQLCE Toolbox for table mapping

    public Profile UserProfile 
    {
        get { return profile; }
        set
        {
            profile = value;
            RaisePropertyChanged("UserProfile");
        }
    }

    public ProfileViewModel()
    {  
        if (IsInDesignMode)
        {
            // Code runs in Blend --> create design time data.
            UserProfile = new Profile()
            {
               Name = "NA",
               Age = 22
            }
        }
        else
        {
            // Code runs "for real"
            UserProfile = GetProfile(); 
        }
    }
}

在 Expression blend 中,我可以看到 ViewModel 但看不到 Profile 属性,所以我猜测某处正在生成异常。

我确实尝试将混合作为一个过程附加,但没有出现错误。经过一点阅读,我发现混合无法连接到数据库,因此您必须在设计模式下弥补一些数据。我只是尝试做UserProfile = new Profile(),但我猜它仍在尝试使用数据库来创建它?

编辑:好的,我认为我遇到的问题与使用 SQLCE 有关。如果我尝试使用 WPF 和 MS SQL 进行类似的操作,那么一切正常。

编辑 2:这与数据库明确相关。如果我从上面的代码中删除公共属性 UserProfile,则可以从 Blend 中看到所有其他属性(我的代码中未显示)。如果我把它加回去,那么没有一个是可见的。那么我怎样才能使它可混合呢?

4

2 回答 2

3

您必须使用该Locator机制。默认情况下,您可以在 MVVM 应用程序中看到它。

在设计模式下,您将提供Profile对象的预构建版本,但在非设计模式下,Profile对象将通过您的数据库提供。因此,您不会new Profile()直接使用,而是使用类似Locator.ProvideMeWithUserProfile().

例如,您可以查看此视频以了解实现它的方法。

于 2013-02-25T21:29:50.213 回答
1

我在这里注意到几件事。

您将设计时数据(和非设计时间)分配给支持字段,而不是属性,因此您的 RaisePropertyChanged() 不会被调用。如果属性更改,这将阻止视图更新,但您仍然应该“有权访问”该属性。可能不是问题,因为这发生在构造函数中。

此外,在您的文本中,您一直在谈论 Profile 属性,但该属性实际上称为 UserProfile。

于 2013-04-18T20:11:31.423 回答