在呈现/实例化View时通知ViewModel

Mat*_*olf 4 c# wpf view mvvm viewmodel

我有一个自定义usercontrol(ChartControl),我在我的WPF应用程序(MainApp)中使用,我呈现如下:

<ContentControl Grid.Row="1" Content="{Binding ChartControl, Mode=OneWay}" />
Run Code Online (Sandbox Code Playgroud)

启动MainApp后,按给定顺序执行以下操作:

MainApp查看MainApp ViewModel ChartControl ViewModel ChartControl视图

我从ChartControlViewModel的构造函数中实例化MainAppViewModel.问题是在实例化ChartControlViewModel之后我还需要ChartControl从内部调用一个方法MainApp.

我遇到的问题是,在调用方法作为其viewmodel的一部分之前,我需要ChartControl渲染视图(InitializeComponent执行它).

我认为一个解决方案可能是在完全实例化和设置时从视图中通知视图模型.这是一个可行的解决方案,如果是,我该怎么做?

总之,我需要在调用匹配的viewmodel的方法之前完全设置视图.我遇到的问题是,在这种情况下,视图模型首先被实例化,然后才会呈现视图.

有任何想法吗?

谢谢

Nit*_*tin 6

您可以使用Interactivity触发器在任何UI事件上触发VM上的Command

您可以像下面一样监听UserControl的Loaded事件,并将其绑定到VM上的Command:

<UserControl x:Class="Test.TestView.MyUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        x:Name="myControl" >

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
        <i:InvokeCommandAction Command="{Binding ElementName=myControl, Path=OnLoadedCommand}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>
Run Code Online (Sandbox Code Playgroud)

确保你的VM中有Command

public ICommand OnLoadedCommand { get; private set; }

public MyUserControl()
{
    OnLoadedCommand = new DelegateCommand(OnLoaded);
}

public void OnLoaded()
{
}
Run Code Online (Sandbox Code Playgroud)

  • 如果UserControl的DataContext设置为ViewModel(通常),则应使用Command ="{Path = OnLoadedCommand}".myControl(this)不包含OnLoadedCommand(ViewmModel).在视图中(this = myControl =后面的代码),您可以直接使用事件(通过事件处理程序). (2认同)

Hog*_*ler 5

连接Loaded事件的另一种方法,基本上呈现与nit的答案相同的结果,只是在视图的构造函数中引用您的viewmodel并添加一个事件处理程序,该处理程序又调用您需要调用的任何方法,如下所示:

public MyControl()
{
   InitializeComponent();

   this.Loaded += (s, e) => { ((MyViewModel)DataContext).MyInitializer(); };
}
Run Code Online (Sandbox Code Playgroud)

如果您发现语法令人困惑,您可能需要阅读匿名方法订阅事件处理程序(使用匿名方法).