2014-02-17 37 views
3

我想弄清楚的兩件事情是,如何在用戶控件的可見性發生更改時傳遞觸發器並將可見性值作爲參數傳遞。使用交互觸發器調用可見性更改方法WPF

無論出於何種原因,觸發器似乎沒有被觸發。我剛剛在ControlVisible參數中添加了一些內容,以顯示我想要發生的情況,當測試它不在那裏時,並且在可見性發生變化時只需要在其中添加一個消息框,就像在註釋掉的方法中那樣。

我使用4.0和Visual Studio 2010

主窗口視圖包含用戶控制

<Window x:Class="bt.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:vm="clr-namespace:bt" 
     xmlns:ctrls="clr-namespace:bt.Controls" 
     xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
     xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 
     mc:Ignorable="d"> 

    <Grid> 
     <ctrls:Login Visibility="{Binding DataContext.Vis,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window},Converter={StaticResource BooleanToVisibilityConverter}}" > 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="IsVisibleChanged"> 
        <ei:CallMethodAction MethodName="VisibleTrigger" /> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </ctrls:Login> 
    </Grid> 
</Window> 

用戶控件視圖模型:

namespace bt.Controls 
{ 
    class LoginViewModel 
    { 
     public LoginViewModel() 
     { 
     } 

     public void VisibleTrigger(bool ControlVisible) 
     { 
      if (ControlVisible) 
      { 
       MessageBox.Show("Start timer"); 
      } 
      else 
      { 
       MessageBox.Show("Stop timer"); 
      } 
     } 

     //public void VisibleTrigger() 
     //{ 
     // MessageBox.Show("Changed"); 
     //} 
    } 
} 

回答

3

首先,我們需要設置TargetObject屬性to viewmodel/DataContext,因爲要調用的方法在視圖模型中可用:

...... 
<i:Interaction.Triggers> 
    <i:EventTrigger EventName="IsVisibleChanged"> 
     <ei:CallMethodAction MethodName="VisibleTrigger" TargetObject="{Binding}"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 
...... 

其次,EventTrigger似乎並不專門用於IsVisibleChanged事件。所以上面的代碼片段適用於其他事件,但不適用於IsVisibleChanged。我們可以找到答案的解決方法,this SO question,通過使用PropertyChangedTrigger聽Visibility屬性改變,而不是聽IsVisibleChanged在事件:

<i:Interaction.Triggers> 
    <ei:PropertyChangedTrigger Binding="{Binding Visibility, ElementName=MyControlName}"> 
     <ei:CallMethodAction MethodName="VisibleTrigger" TargetObject="{Binding}"/> 
    </ei:PropertyChangedTrigger> 
</i:Interaction.Triggers> 

三,CallMethodAction似乎並不提供一種方式來傳遞參數方法。爲了能夠使用參數調用方法,我們最好使用InvokeCommandAction而不是CallMethodAction,建議here@Rohit也建議使用previous question

+0

沒有InvokeCommandAction,還是可以從跳轉到並返回到? – Hank

+0

還沒有試圖確定,但我認爲沒關係。你試過了嗎? – har07

+0

yeap,它不會失敗,但它無法找到方法......沒關係,實現了ICommand,它的工作原理,謝謝! – Hank