1

我似乎无法找到一种方法来检测面板何时完成加载。我正在向已经存在的 WPF/Prism 项目添加几个功能。当页面完成渲染时,我需要被回调。我试过这个:

在页面加载时我需要回调的 XAML 顶部的 UserControl 中:

<UserControl x:....

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
...>

<i:Interaction.Triggers>
        <i:EventTrigger EventName="Loaded">
            <i:InvokeCommandAction Command="{Binding DoSomething}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>

然后在文件后面的代码中:

public void DoSomething(object sender, EventArgs e)
{
     System.Diagnostics.Debug.WriteLine("received callback");
}

它目前不起作用,我不确定这是否是正确的路径,因为我是 WPF、prism 和 .NET 的新手。

4

2 回答 2

1

好吧,我看到您已经知道答案了...无论如何...您做错了什么,您一直在将事件绑定到 XAML 中的命令,而您没有命令:) 基本上,您将标准的“代码隐藏方法”搞砸了让我们说“MVVM 方法”/绑定。

因此,当您触摸代码隐藏并在DoSomethingEventHandler那里创建您的代码时,您可以简单地

    <UserControl .. Loaded="UserControl_Loaded"> 
    .. 
    </UserControl>

使用您的 CodeBehind:

    private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        // Do Something
    }

没关系...但它不是 MVVM :]

好吧,对于你的新方法(没有代码隐藏/让我们说 MVVM)......

如果您使用 Prism v4.1,您可以在此处查看大多数人在 Prism 中错过的此功能 :) 但提到了解决方案 :)

好吧,你知道你需要ICommand你绑定到......它不一定是DelegateCommand你可以使用你想要的......(我更喜欢并使用RelayCommand

好吧,但是我们从上述链接中学到了什么?

  1. 有时...不是这次...ICommand可以更改控件启用状态,并且当您不使用时它不会更新,Prism's Interactivity而您只需使用Blend SDK's Interactivity...您这次不需要它...我承认...但也许有一天:)
  2. 而且你不需要处理程序中的那些愚蠢的参数,因为你无论如何都没有得到它们:D(当你需要那些 Args 时,你可以使用 MVVM Light 例如。)

所以你能做的最好的就是:

<UserControl
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:prism="clr-namespace:Microsoft.Practices.Prism.Interactivity;assembly=Microsoft.Practices.Prism.Interactivity"
...    
>
...
<i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
        <prism:InvokeCommandAction Command="{Binding MyCommand}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

和你的 ViewModel 例如:

    public ICommand MyCommand
    {
        get
        {
            return new RelayCommand(this.MyCommandExecute);
        }
    }

    private void MyCommandExecute()
    {
        // DO Something...
    }

抱歉,我没有回答已经回答的问题,但我想我可能会添加一些有趣的信息:)

于 2013-01-22T14:00:34.757 回答
0

哦,我想我刚刚想通了。找到这篇文章:绑定 Loaded 事件?

我需要创建一个新的 DelegateCommand

public DelegateCommand DoSomething {get; set; }

然后将其绑定到回调:

DoSomething = new DelegateCommand(DoSomethingCommandHandler);

然后在我的

private void DoSomethingCommandHandler
{
    // callback received
}

似乎工作。让我知道是否有更好的东西。就像我说的,我完全是菜鸟。

于 2013-01-15T17:21:40.133 回答