[英]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.