ViewModelからバインディングを作成する方法

私はテキストボックスに押されているEnterキーをキャプチャしようとしているので、サーバのアップデートを開始することができます。それは機能していないので、私はそれを単純化されたエレメントに縮小しました。

この例では、キーストロークごとにバインディングが実行されているとは限りませんが、後で実行されます。 Enterキーを押すまでにバインディングを完了する必要があります。 VMから次のXAMLと関数を検討してください。

ここには、テキストボックスのXAMLがあります


    
        
            
        
    

KeyDownCommandが期待どおりに起動し、値がTextValueプロパティにまだ設定されていないことを示します。私が2回目に入ると値がプロパティに入りますか?ここにKeyDownCommandがあります。 ViewModelのコンストラクタはkeyDownCommandを正しく設定します。

public RelayCommand KeyDownCommand { get; private set; }
private void KeyDownAction(RoutedEventArgs eventArg)
{
    var source = eventArg.OriginalSource as FrameworkElement;
    var e = eventArg as KeyEventArgs;
    if (source != null && e != null && e.Key== Key.Enter)
    {
        e.Handled = true;
        MessageBox.Show(TextValue);
    }
}

私が必要とするのは、Enterキーが押されたときにTextBoxのTextをVMのTextValueプロパティに「ポスト」する方法です。それとも私が紛失している何かがあります。

0

2 答え

バインド時に UpdateSourceTrigger PropertyChanged に設定してみてください。


これで、ビューのモデルプロパティは、テキストが変更されるたびに更新されます。

更新:

Silverlightの場合、 UpdateSourceTrigger の代わりに、テキストが変更されたときにバインディングソースを更新する次の単純な動作を使用できます。

public class TextChangedUpdateSourceBehavior : Behavior
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.TextChanged += OnTextChanged;
    }

    private void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        var bindingExpression = AssociatedObject.GetBindingExpression(TextBox.TextProperty);

        if (bindingExpression != null)
        {
            bindingExpression.UpdateSource();
        }
    }
}

このように使用してください:


    
        
    

2
追加された
UpdateSouceTrigger = PropertyChangedはSilverlightのオプションではありません。唯一の2つのオプションはDefaultとExplicitです。
追加された 著者 Ralph Shillington,
@ Ralph - 申し訳ありませんが、その質問がSilverlight用であることに気付かなかった。 Silverlightソリューションの最新の回答を参照してください。
追加された 著者 Pavlo Glazkov,

私は答えを打つよりも早く質問を投稿しました。

修正されたKeyDownActionは次のとおりです

private void KeyDownAction(RoutedEventArgs eventArg)
{
    var source = eventArg.OriginalSource as FrameworkElement;
    source.GetBindingExpression(TextBox.TextProperty).UpdateSource();
    var e = eventArg as KeyEventArgs;
    if (source != null && e != null && e.Key== Key.Enter)
    {
        e.Handled = true;
        MessageBox.Show(TextValue);
    }
}

今のところ私がこれをタイプするとき、私はパターンを "壊している"ことを認識しています。今のところ私のViewModelはそれが必要とするViewについてもっと知っています。

1
追加された