【问题标题】:C# WPF MVVM: Calling an ObjectC# WPF MVVM:调用对象
【发布时间】:2011-07-26 17:10:15
【问题描述】:

我有一个QuestionsFile 课程,里面有问题、名字等...

现在我已经创建了一个 wpf 应用程序,并且我有一个包含不同页面的窗口。这些页面继承BaseViewModel 类。我在WindowViewModel 类中创建我的页面(我将一个新的QuestionsFile 对象传递给构造函数并通过其他视图模型的构造函数分派它):

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);`

所有这些视图模型都继承了具有QuestionsFile 属性的BaseViewModel 类。

因此,假设我从组合框中更改了 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();
        }
    }

【问题讨论】:

  • 你能设置一些断点来看看什么时候设置的吗?
  • 首先我创建了我的 windowviewmodel,在其中创建了一个新的 Questionsfile,然后我创建了我的页面,所以第一个代码块.. 然后我从组合框中选择了一个 questionsfile,然后我调用了 setter selectedfile,我这样做的地方:this.QuestionsFile = value.GetValue();所以'this'指的是baseviewModel,他在其中调用了问题文件的设置器,然后他当然改变了属性
  • setter 工作,所以当你调试它会将 questionsFile 设置为值......唯一的问题是当我尝试调用 QuestionsFile 的 getter..
  • 所以qfile = value 工作并且它具有正确的值,但是当调用get 时,qfile 已更改为null?也许你有其他人在修改 qfile,或者你在 set 和 get 之间有不同的 ViewModel。
  • 也许需要更多信息,这就是我在我的视图模型的构造函数中所做的(我在创建页面(第一个代码块)中创建的): public ChooseQuestionsFileViewModel(QuestionsFile qf):base( qf) { }

标签: wpf object mvvm properties binding


【解决方案1】:

根据我对您的看法,您有一组 QuestionFiles(通过 OptionsViewModel),您正在通过 SelectedFile 属性选择其中一个。此时您正在设置所选的QuestionFile 属性。

这对ChooseQuestionViewModel (我假设它包含SelectedFile 属性)都很好。我不确定这是您的问题,但SelectedFile 不会反映在ShowQuestionsFileViewModel 中,因为现在两个视图模型都引用不同的实例。

这是你的问题吗?在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;
    }
}

【讨论】:

    猜你喜欢
    • 2017-01-18
    • 2022-10-06
    • 1970-01-01
    • 2020-04-01
    • 2018-03-29
    • 2011-06-25
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多