簡體   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