[英]Binding to model property not working
我需要将域模型(将其加载到视图模型中)的属性值绑定到我的Shell视图上控件的内容,但是它根本无法工作(内容保持空白)。 我怎样才能解决这个问题? 域模型也需要实现INotifyPropertyChanged吗?
public class ShellViewModel : Conductor<ProjectViewModel>.Collection.OneActive, IShell
{
public ShellViewModel() {
ActivateItem(new ProjectViewModel(new Project { ProjectName = "Test" }));
}
}
<TabControl x:Name="Items">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding ActiveItem.Project.ProjectName}" />
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
public class ProjectViewModel : Screen
{
private Project _project;
public Project Project
{
get { return _project; }
private set
{
_project = value;
NotifyOfPropertyChange(() => _project);
}
}
public ProjectViewModel(Project project)
{
Project = project;
}
public class Project
{
public string ProjectName { get; set; }
}
如果要使用绑定,则绑定的对象必须实现INotifyPropertyChanged。 否则,您只会看到初始值。 所以是的,简单的方法是您的域模型实现INotifyPropertyChanged。
<TextBlock Text="{Binding ActiveItem.Project.ProjectName}" />
wpf的这一行不关心OnPropertyChanged(“ Project”),因为它绑定到ProjectName。
不要让Conductor.Collection的类型为ProjectViewModel,使其成为Screen或IScreen,因为ProjectViewModel继承了Screen的最佳选择。 完成此操作后,您将在ShellViewModel的构造函数中进行集合调用。
shellviewmodel将如下所示。
public ShellViewModel(/*IEnumerable<Screen> screens*/){ // Not Necessary
//automatically finds what is in the IoC Container
//(MEF, SimpleContainer, AutoFac, StructureMap etc...
//Assuming your using one...
//this.Items.AddRange(screens);
this.Items.Add(new ProjectViewModel(new Project(){ ProjectName = "Test";}));
}
protected override OnInitialize(){
}
模板
<TabControl x:Name="Items">
<TabControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding DisplayName}" />
<TextBlock Text="{Binding Project.ProjectName}" />
</StackPanel>
</DataTemplate>
</TabControl.ItemTemplate>
我之所以选择DisplayName
,是因为它已经作为属性存在于Screen的类对象中了...这样,您不必做很多额外的工作,就可以对ViewModels进行编码。
public class ProjectViewModel : Screen{
private Project _project;
public ProjectViewModel(Project project){
DisplayName = "Test" ;
Project = project;
}
public Project Project{
get{ return _project;}
private set{
_project = value;
NotifyOfPropertyChange();
}
}
}
在要显示的Model对象上,将继承PropertyChangedBase
在ViewModel上,它们将继承PropertyChangedBased,Screen或什至Conductor(例如)。 所有人都有不同的需求,以适应您的尝试。
要看的另一件事是项目中的IoC容器,实际上有2个。 1 SimpleContainer 2 MEF,大多数(如果不是全部)样本都使用MEF。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.