2017-04-12 3 views
0

UWPプロジェクトでEventTriggerBehaviorsを設定する方法を理解しようとしています。 は、だから私は、私はパッケージがインストールさMicrosoft.Xaml.Behaviors.Uwp.Managed持っている必要があることを理解し、次の名前空間は、私のXAMLファイルで宣言:ボタンへのUWP EventTriggerBehaviors GotFocus

xmlns:Core="using:Microsoft.Xaml.Interactions.Core" 
xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" 

はそれ自体で、ボタンは次のように宣言する必要があります。

<Button x:Name="btnTest > 
    <Interactivity:Interaction.Behaviors> 
     <Core:EventTriggerBehavior EventName="GotFocus" > 
      <Core:EventTriggerBehavior.Actions> 
       <Core:InvokeCommandAction Command="{Binding ... }" /> 
      </Core:EventTriggerBehavior.Actions> 
     </Core:EventTriggerBehavior> 
    </Interactivity:Interaction.Behaviors> 
</Button> 

しかし、私は迷子になりました...ボタンがフォーカスを取得したら、テキストボックス内に(ボタン名に基づいて)テキストを設定します。

サービスが必要ですか?ViewModelコードはどうすればよいですか?

実際には、偉大な読書、例、本をお勧めすることができる人は誰ですか?ジェームズ・リプライ以下

更新: XAML InvokeCommandActionは次のようになります。

<Core:InvokeCommandAction Command="{Binding OnButtonFocusCommand}" CommandParameter="{Binding Name, ElementName=btnTest}" /> 

しかし、どのように私はViewModelにでメソッド内のパラメータを受け取りますか?

答えて

1

InvokeCommandActionコマンドプロパティは、EventTriggerBehaviorが発生したときにアクションを実行するために、ビューモデルでICommandを実装する必要があります。

あなたはXAMLでこのような何かがあるかもしれません:DelegateCommandが内蔵されていない

public ViewModel() 
    { 
     OnButtonFocusCommand = new DelegateCommand(() => 
     { 
      this.TextBoxText = "Hello, World"; 
     }); 
    } 

    public ICommand OnButtonFocusCommand { get; private set; } 

<Button x:Name="btnTest"> 
     <Interactivity:Interaction.Behaviors> 
      <Core:EventTriggerBehavior EventName="GotFocus"> 
       <Core:EventTriggerBehavior.Actions> 
        <Core:InvokeCommandAction Command="{Binding OnButtonFocusCommand}" /> 
       </Core:EventTriggerBehavior.Actions> 
      </Core:EventTriggerBehavior> 
     </Interactivity:Interaction.Behaviors> 
    </Button> 

は、その後バインドされたビュー・モデルでは、あなたがこれに似た何かを持っているでしょうしかし、あなたはDelegateCommandまたはRelayCommandをオンラインで多くの実装を見つけることができます。

EDIT:あなたはまた、次のように使用して渡されたパラメータでこれを行うことができます。

public ViewModel() 
    { 
     OnButtonFocusCommand = new DelegateCommand<RoutedEventArgs>(args => 
      { 
       this.TextBoxText = "Hello, World"; 
      }); 
    } 

RoutedEventArgsはあなたが通過しているパラメータの種類になります。 Focusイベントが通過した場合、これが受け取るパラメータです。これらのシナリオでは、DelegateCommand{T}が必要です。

私が参照したDelegateCommandの例には、モデルを検証してアクションを実行するかどうかをチェックするメカニズムもあります。あなたがそうのようなことを行うことができます:あなたのシナリオでは

public ViewModel() 
    { 
     OnButtonFocusCommand = new DelegateCommand<RoutedEventArgs>(args => 
      { 
       this.TextBoxText = "Hello, World"; 
      }, 
      args => args.OriginalSource is TextBox); 
    } 

をテキストボックスのテキストを更新すると、あなたはあなたのビューモデルでプロパティを作成する必要があります(私の例では、私はTextBoxTextが更新されてありました)。そのプロパティは、XAMLのTextBoxのTextプロパティまでバインディングする必要があります。

MVVMフレームワーク(おそらくMvvmLight)を見て、まだ読んでいない場合はそれを読んでみることをお勧めします。

また、official Microsoft samples on GitHubには、役に立つかもしれない多くのトピックが含まれています。

さらに詳しい情報が必要な場合は、お気軽にお問い合わせください。

+0

ジェームズありがとう、あなたの返信は非常に便利ですが、不完全です。 commandparameterから値を渡すと、どのように受け取ることができますか? –

+0

@FranckEコマンドにパラメータを渡すDelegateCommand {T}シナリオを示す私の答えを更新しました。 –

+1

ありがとう、これは素晴らしい:) –

関連する問題