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