4

Silverlightアプリケーションを使用しています。ボタンのクリックコマンドをViewModelのリレーコマンドにバインドし、いくつかのパラメーターをそれに渡そうとしています。私のビューのコードは次のとおりです。

<Button x:Name="button" Content="Button" VerticalAlignment="Top" Margin="173,0,152,0">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <i:InvokeCommandAction CommandParameter="{Binding ActualWidth, ElementName=button, Mode=TwoWay}" Command="{Binding CRelayDecimal, Mode=OneWay}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
</Button>

ボタンは、コマンドのパラメーターのパラメーターとしてそのActualWidthを渡します。私のViewModelコードは次のとおりです。

public Page1()
{
    InitializeComponent();
    CRelayDecimal = new RelayCommand<Object>(this.GetDecimal);
}

public RelayCommand<Object> CRelayDecimal { get; private set; }

private void GetDecimal(Object Obj)
{
    var value = (double)Obj;
}

さて、ここで私が見ている問題は、私が受け取るほとんどの時間経過したパラメーター値が0.0であるということです。断続的に、私は値が正確な値(.. 75.0など)である必要があることを確認しました。

それを行う他の方法はありますか?

よろしくお願いします。

よろしくお願いします

ニシャントラナ

4

4 に答える 4

1

はい、これを行うには少なくともお互いがあります。Commandあなたの例から、ViewからViewModelに値を送信したいだけなので、使用するのは意味がありません。

メッセンジャーを使用して、ViewとViewModelの間で値を送信することをお勧めします。あなたがしなければならないことは次のとおりです。

1)ViewModelのメッセージに登録します。私はそのコンストラクターでこれを行うことを好みます。また、メッセンジャーからのコールバックを処理するメソッドを追加する必要があります。"tokenId"意図したサブスクライバーにメッセージを送信することを確認するために使用することに注意してください。

Messenger.Default.Register<double>(this, YourMethodHere, "tokenId");

private void YourMethodHere(double value)
{
    // do your work here
}

2)ビュー内で、ボタンにイベントを追加し、メッセンジャーを介してメッセージを送信する必要があります。

private void Button_Click(object sender, RoutedEventArgs e)
{
    Messenger.Default.Send<double>(this.ActualWidth, "tokenId");
}

3)Unregister複数のメッセージの送信を防ぐために、デストラクタでViewModelをサブスクライブできます。

于 2012-10-29T03:58:02.453 に答える
1

DataContextから「ActualWidth」のバインディング値を取得していると思います。これはおそらくViewModel(ActualWidthがプロパティとして存在しない場合)です。

これはうまくいくかもしれません。「this.button.DataContext=this;」を設定してみてください。ビューコードのLoadedイベントハンドラーで。したがって、ビューはボタンの最初に選択されるデータコンテキストになります。CRelayDecimalなどの未解決のバインディングプロパティは、引き続きViewModelにフォールバックする必要があります。

または、おそらく最も簡単な方法は、ビューコードが処理するボタンに通常のクリックハンドラーを接続することです。ビューコードは、イベント送信者から実際の幅を計算し、必要に応じてモデルのRelayCommandを送信します。

于 2012-10-29T03:41:05.113 に答える
1

フィードバックありがとうございます!

さらに調べてみると、問題はそれにバインドしたプロパティ、つまり「ActualWidth」が原因であることがわかりました。プロパティ「Width」にバインドしようとすると、正常に機能します。

したがって、「ActualWidth」プロパティの初期化値のみを取得していると思います。

もう少しテストをさせてください。そうすれば、さらに多くの結果が返ってきます。

よろしくお願いします

ニシャントラナ

于 2012-11-02T03:37:09.180 に答える
1

さて、これが機能しなかった理由を理解しました。これは、Silverlightの既知の問題だからです。

MSFTの詳細については、このリンクをお読みください。

于 2012-11-02T07:23:10.513 に答える