C#WPF MVVM:调用对象

C#WPF MVVM:调用对象

问题描述:

我有一个QuestionsFile类,它有问题,名称等..C#WPF MVVM:调用对象

现在我已经创建了一个WPF应用程序,我有这有不同的页面的窗口。这些页面继承了BaseViewModel类。创建我的WindowViewModel类网页(其中我传递一个新QuestionsFile对象的构造和派遣它通过其他的ViewModels的构造函数):

var chooseQFVM = new ChooseQuestionsFileViewModel(this.QuestionsFile); 
var showChosenQFVM = new ShowChosenQuestionsFileViewModel(this.QuestionsFile); 

var pages2 = new List<WizardControlViewBaseModel>(); 
pages2.Add(chooseQFVM); 
pages2.Add(showChosenQFVM); 

pages = new ReadOnlyCollection<WizardControlViewBaseModel>(pages2);` 

所有这些的ViewModels继承BaseViewModel类有QuestionsFile财产。

所以当我们假设我改变chooseQFView变量的QuestionsFile属性,并且我给它通过 - BaseBiewModel类中的相同属性必须更改。因此,这是该代码的财产在BaseBiewModel类:

public QuestionsFile QuestionsFile 
    { 
     get { return qfile; } 
     set 
     { 
      qfile = value; 
      OnPropertyChanged("QuestionsFile"); 

     } 
    } 

所以我称之为PropertyChanged事件,但是当我想打电话给这个属性在接下来的页面,我调试它说的所有属性我QuestionsFile为空..

这是我改变QuestionsFile属性的值代码:

public OptionViewModel<QuestionsFile> SelectedFile 
    { 
     get 
     { 
      return selectedFile; 
     } 
     set 
     { 
      selectedFile = value; 
      OnPropertyChanged("SelectedFile"); 
      this.QuestionsFile = value.GetValue(); 
     } 
    } 
+0

你可以设置一些断点,看看有什么被设定,当? – 2011-03-31 08:43:34

+0

首先,我创建我的windowviewmodel,在其中创建一个新的问题文件,然后创建我的页面,以便第一个代码块。然后从组合框中选择一个问题文件,然后调用selectedfile的setter,在此处执行此操作: this.QuestionsFile = value.GetValue();因此'this'指的是baseview模型,他在那里调用了Problemfile的setter,然后他执行了课程 – 2011-03-31 08:48:41

+0

的属性changed,并且setter可以工作,所以当你调试它时会将questionsFile设置为值...唯一的问题是什么时候我尝试调用QuestionsFile的getter .. – 2011-03-31 08:53:19

从我对你的看法了解你的QuestionFile秒的采集(通过OptionsViewModel),您可以通过SelectedFile属性选择其中的一个。此时您正在设置所选的QuestionFile属性。

这对ChooseQuestionViewModel(我认为它包含SelectedFile属性)都是好的。我不确定这是否是您的问题,但SelectedFile不会反映在之内,因为现在两种视图模型都引用不同的实例。

这是您的问题?您看不到ShowQuestionsFileViewModel中所选QuestionFile的更改?

如果是这样你需要告诉它已经通过事件改变,或具有参考ChooseQuestionViewModel因此它可以监听PropertyChanged事件,这样你可以抓住从所选择的项目,并更新自身的其他视图模型。

//Ctor 
public ShowQuestionsFileViewModel(ChooseQuestionViewModel chooseViewModel) 
{ 
    _chooseViewModel = chooseViewModel; 
    chooseViewModel.PropertyChanged += ChoosePropertyChanged 
} 

private void ChoosePropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if(e.Property == "SelectedFile") 
    { 
     this.SelectedFile = _chooseViewModel.SelecteFile; 
    } 
}