2017-04-12 81 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}" /> 

但我怎麼得到的視圖模型的方法中的參數?

回答

1

InvokeCommandAction Command屬性需要在視圖模型中實現一個ICommand,以便在觸發EventTriggerBehavior時執行操作。

您可能必須在XAML是這樣的:

<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> 

然後在綁定的視圖模型,你就必須與此類似:

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

    public ICommand OnButtonFocusCommand { get; private set; } 

的DelegateCommand沒有內置在但是你可以在網上找到很多DelegateCommand或RelayCommand的實現。

編輯:您還可以使用這樣的傳遞的參數做到這一點:

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

謝謝詹姆斯,你的回覆非常有用,但是不完整。如果我從命令參數傳遞一個值,我該如何接收它? –

+0

@FranckE我已經更新了我的答案,顯示了通過參數傳遞給命令的DelegateCommand {T}場景。 –

+1

謝謝,這個作品很棒:) –