繁体   English   中英

绑定到模型属性不起作用

[英]Binding to model property not working

我需要将域模型(将其加载到视图模型中)的属性值绑定到我的Shell视图上控件的内容,但是它根本无法工作(内容保持空白)。 我怎样才能解决这个问题? 域模型也需要实现INotifyPropertyChanged吗?

ShellViewModel

public class ShellViewModel : Conductor<ProjectViewModel>.Collection.OneActive, IShell
{

    public ShellViewModel() {
        ActivateItem(new ProjectViewModel(new Project { ProjectName = "Test" }));
    }

}

ShellView(选项卡控件)

<TabControl x:Name="Items">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding ActiveItem.Project.ProjectName}" />
            </DataTemplate>
        </TabControl.ItemTemplate>
</TabControl>

ProjectViewModel

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM