使用Prism、Silverlight和ViewFirst方法时绑定中断

使用Prism、Silverlight和ViewFirst方法时绑定中断,silverlight,data-binding,prism,viewmodel,Silverlight,Data Binding,Prism,Viewmodel,我们面临的问题是,我们无法约束自己的工作 首次使用视图模型时的prism silverlight应用程序 方法“视图优先”方法可以很好地工作。我们已经看了一遍了 官方文件和各种网站,但仍然没有 解决了这个问题。下面是视图模型的代码, 以及“视图优先”方法。我们错过什么了吗?在我的博客上读到它 视图模型优先方法: 引导程序: internal void RegisterLoginRegionAndView() { IRegionManager regionManager

我们面临的问题是,我们无法约束自己的工作 首次使用视图模型时的prism silverlight应用程序 方法“视图优先”方法可以很好地工作。我们已经看了一遍了 官方文件和各种网站,但仍然没有 解决了这个问题。下面是视图模型的代码, 以及“视图优先”方法。我们错过什么了吗?在我的博客上读到它

视图模型优先方法: 引导程序:

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

       regionManager.RegisterViewWithRegion(ShellRegionNames.MainRegion,
       () => Container.Resolve<IViewModel>().View);
    }
regionManager.RegisterViewWithRegion(ShellRegionNames.MainRegion, typeof(IView));
ViewModel界面:

 public interface IViewModel
   {
       IView View { get; set; }
   }
public interface IView
   {
       void SetModel(IViewModel model);
   }
查看界面:

 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}" />
视图优先方法 引导程序:

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

       regionManager.RegisterViewWithRegion(ShellRegionNames.MainRegion,
       () => Container.Resolve<IViewModel>().View);
    }
regionManager.RegisterViewWithRegion(ShellRegionNames.MainRegion, typeof(IView));
视图模型:

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

       User = new User();
       User.Username = "TestUser";
   }
  public ViewModel()
   {
       User = new User();
       User.Username = "TestUser";
   }
查看隐藏代码:

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

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

您在视图上的
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));
          }
     }
}
然后,我所有的ViewModels都从中派生:

public class MyViewModel : ViewModelBase
{
     private User _user;
     public User User
     {
         get { return _user; }
         set
         {
              _user = value;
              OnPropertyChanged("User");
         }
     }
}
注意:在您的情况下,“用户”对象可能也应该是一个ViewModel,并且还应该为Username属性引发OnPropertyChanged


希望这能有所帮助。

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

public ViewModel(IView view) { View = view; User = new User(); User.Username = "TestUser"; View.SetModel(this); } 公共视图模型(IView视图) { 视图=视图; User=新用户(); User.Username=“TestUser”; View.SetModel(this); }
解决了问题。

我解决了,但格式弄乱了。它就在XAML代码的正下方。但从外观上看,它看起来不错。谢谢这导致了一个问题,因为您的ViewModel显然没有正确实现INotifyPropertyChanged。这不应该是一个问题。我将更新我的回复,补充一些与此相关的措辞。