如何从视图中为ViewModel中的所有属性调用OnChangedProperty?

时间:2018-05-02 07:17:57

标签: c# wpf inotifypropertychanged

我的Page1.xaml.cs(代码隐藏)中有一个需要更改ViewModel中所有属性的事件。

以下是一个示例:( Page1.xaml.cs)

public Page1()
{        
    InitializeComponent();

    example.Event += example_Event;
}

private void example_Event(...)
{ 
    // here I want to change all Properties in my ViewModel
}

我怎样才能做到这一点?

修改

我有一个显示.ppt的WebBrowser-Control。我想在触发此事件时更新ViewModel中的所有属性:

xaml.cs:

private void powerPointBrowser1_LoadCompleted(object sender, NavigationEventArgs e)
    {
        //...
        oPPApplication.SlideShowNextSlide += ppApp_SlideShowNextSlide; //Event that gets triggered when i change the Slide in my WebBrowser-Control

    }

private void ppApp_SlideShowNextSlide(PPt.SlideShowWindow Wn)
    {
          // here i dont know how to get access to my Properties in my VM (i want to call OnChangedProperty(//for all properties in my VM))
    }

1 个答案:

答案 0 :(得分:1)

通常,View(包括代码隐藏)没有责任通知ViewModel的属性进行更新,它应该是相反的方式。但是,我认为在你的情况下,你想在处理某个事件时做某些事情(在这种情况下,检索每个属性的最新值),所以这里是:你需要的一些解决方案。

在您的VM中,定义一个将PropertyChanged触发到所有属性的方法:

public void UpdateAllProperties()
{
    // Call OnPropertyChanged to all of your properties
    OnPropertyChanged(); // etc. 
}

然后在View的代码中,您需要的只是调用该方法:

// every View has a ViewModel that is bound to be View's DataContext. So cast it, and call the public method we defined earlier.
((MyViewModel)DataContext).UpdateAllProperties();

遗憾的是,对于MVVM风格,这种方法并不是很优雅。我建议你把这个方法/事件处理程序作为Bindable ICommand。因此,您不需要编写任何代码,例如:在您的VM中定义ICommand

public ICommand UpdateAllPropertiesCommand {get; private set;}
   = new Prism.Commands.DelegateCommand(UpdateAllProperties);
// You can switch the UpdateAllProperties method to private instead.
// Then remove any code behinds you had.

然后,在您的视图(xaml)中,您可以将ICommand绑定到某个控件的事件触发器。

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

<!--In one of the controls-->
<i:Interaction.Triggers>
   <i:EventTrigger EventName="Loaded">
      <i:InvokeCommandAction Command="{Binding UpdateAllPropertiesCommand , Mode=OneTime}"/>
   </i:EventTrigger>
</i:Interaction.Triggers>

此处,处理加载的事件时将自动调用该命令。