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、プリズム、および.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 に答える