3

我们遇到的问题是,当使用视图模型优先方法时,我们无法在我们的 prism silverlight 应用程序中进行绑定。视图优先方法工作正常。我们浏览了官方文档和各种网站,但仍未解决问题。下面是视图模型优先和视图优先方法的代码。我们错过了什么吗?在我的博客http://silvercasts.blogspot.com上阅读它

视图模型优先方法:

引导程序:

   internal void RegisterLoginRegionAndView()
   {
       IRegionManager regionManager = Container.Resolve<IRegionManager>();

       regionManager.RegisterViewWithRegion(ShellRegionNames.MainRegion,
       () => Container.Resolve<IViewModel>().View);
    }

视图模型:

   public ViewModel(IView view)
   {
       View = view;
       View.SetModel(this);

       User = new User();
       User.Username = "TestUser";
   }

视图模型接口:

 public interface IViewModel
   {
       IView View { get; set; }
   }

查看界面:

public interface IView
   {
       void SetModel(IViewModel model);
   }

查看 Xaml:

 <TextBox x:Name="Username" TextWrapping="Wrap" Text="{Binding User.Username}" />

查看后面的代码:

public void SetModel(IViewModel viewModel)
   {
       this.DataContext = viewModel;
   }

查看第一种方法

引导程序:

regionManager.RegisterViewWithRegion(ShellRegionNames.MainRegion, typeof(IView));

视图模型:

  public ViewModel()
   {
       User = new User();
       User.Username = "TestUser";
   }

查看后面的代码:

public View(IViewModel viewModel)
   {
       InitializeComponent();
       this.DataContext = viewModel;
   }
4

3 回答 3

2

SetModel对视图的实现需要如下:

public void MyUserControl : UserControl, IView
{
     //...
     public void SetModel(IViewModel vm)
     {
          this.DataContext = vm;
     }
}

如果不存在,则需要存在(您尚未发布 的实现SetModel,但在这种情况下,这将是问题的根源)。

如果这不是问题,很可能是因为您的 ViewModel 没有实现INotifyPropertyChanged. 我通常使用执行此操作的基本 ViewModel:

public class ViewModelBase : INotifyPropertyChanged
{
     public event PropertyChangedEventHandler PropertyChanged;
     public void OnPropertyChanged(string propertyName)
     {
          if(PropertyChanged != null)
          {
               PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
          }
     }
}

然后我所有的 ViewModel 都来源于此:

public class MyViewModel : ViewModelBase
{
     private User _user;
     public User User
     {
         get { return _user; }
         set
         {
              _user = value;
              OnPropertyChanged("User");
         }
     }
}

注意:在您的情况下,“用户”对象可能也应该是一个 ViewModel,并且还为 Username 属性引发 OnPropertyChanged。

希望这可以帮助。

于 2009-09-23T18:02:55.517 回答
0

对我来说明显的区别是您在“视图优先”方法中设置 DataContext,而不是在“视图模型优先”方法中。我不确定 Prism 是否为您设置了 DataContext(我猜您假设它设置了),但请尝试手动设置 DataContext 以查看这是否是问题所在。在您的 ViewModel 构造函数中,您调用 View.SetModel(this) - 该调用是否设置了 DataContext?

于 2009-09-23T16:15:43.900 回答
0

问题是我在实例化数据对象之前使用了 SetModel 方法。像这样移动它:


       公共 ViewModel(IView 视图)
       {
           视图=视图;

           用户 = 新用户();
           User.Username = "TestUser";

           View.SetModel(this);
       }

解决了这个问题。

于 2009-09-24T12:27:36.037 回答