【发布时间】:2016-06-27 21:14:24
【问题描述】:
我有一个嵌套视图模型结构,如下例所示:
public class SubViewModel : INotifyPropertyChanged
{
public string Property
{
get
{
// calculate result and return it
}
}
}
public class ViewModel : INotifyPropertyChanged
{
public SubViewModel Sub { get; set; }
public void MyMethod()
{
// executes code that changes some parameters such that Sub.Property changes
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Sub.Property"));
}
}
在某些情况下,父视图模型中发生的更改会影响嵌套视图模型上的属性。换句话说,子视图模型上的属性(示例中为SubViewModel.Property)发生了变化,但子视图模型不知道。
我想调用PropertyChanged,以告知WPF 绑定引擎子视图模型Sub 上的属性Property 已更改。我尝试了以下所有选项,但到目前为止都没有奏效:
OnPropertyChanged("");
OnPropertyChanged("*");
OnPropertyChanged("Sub");
OnPropertyChanged("Sub.Property");
OnPropertyChanged("Sub.*");
有没有办法做到这一点?
请注意:我知道父视图模型可以调用子视图模型上的方法,该方法会在子视图模型上引发PropertyChanged 事件。我有理由不那样做。
【问题讨论】:
-
也许你应该解释你这样做的原因。那么我们或许可以帮助您找出更好的方法来实现您的目标。
-
说真的我还是不太明白你的意思,不过你可以打
OnPropertyChangedinternal,然后打电话Sub.OnPropertyChanged("Property")。我只是在猜测你想要什么,但谁知道 - 这可能是你需要的东西。 -
为什么不能简单地从子视图模型中的每个属性中引发 PropertyChanged 事件。这样当您在主视图模型中更改 subviewmodelinstance.PropertyName 时,将自动引发相应的事件。这是正常的方式。我认为您不需要通过调用子视图模型中的函数来引发事件。
-
SubProperty的 getter 内部发生了什么?它是否读取ViewModel的属性?请解释一下依赖项到底是什么。
标签: wpf binding inotifypropertychanged