2010-11-07 34 views
1

我做:命令模式如何工作?

 <Button 
      Style="{StaticResource buttonstyle}" 
      HorizontalAlignment="Left" Margin="12,21,10,0" 
      VerticalAlignment="Top" Height="78" Width="83" 
      BorderThickness="2" Content="add event" 
      Command="{Binding NewEvent}" 
      CommandParameter="This is the report." 
     > 
     </Button> 

其中的命令是:

public class StringDelegateCommand : ICommand 
{ 
    //methodes without return value 
    Action<string> m_ExecuteTargets = delegate { }; 
    //methodes without parmtters inside 
    Func<bool> m_CanExecuteTargets = delegate { return false; }; 
    //the value whom allows execution 
    bool m_Enabled = false; 


    #region ICommand Members 

    public bool CanExecute(object parameter) 
    { 
     Delegate[] targets = m_CanExecuteTargets.GetInvocationList(); 
     foreach (Func<bool> target in targets) 
     { 
      m_Enabled = false; 
      bool localEnable = target.Invoke(); 
      if (localEnable) 
      { 
       m_Enabled = true; 
       break; 
      } 
     } 
     return m_Enabled; 
    } 

    public event EventHandler CanExecuteChanged = delegate { }; 

    public void Execute(object parameter) 
    { 
     if (m_Enabled) 
      m_ExecuteTargets(parameter != null ? parameter.ToString() : null); 
    } 

    #endregion 

    public event Action<string> ExecuteTargets 
    { 
     add 
     { 
      m_ExecuteTargets += value; 
     } 
     remove 
     { 
      m_ExecuteTargets -= value; 
     } 
    } 

    public event Func<bool> CanExecuteTargets 
    { 
     add 
     { 
      m_CanExecuteTargets += value; 
      CanExecuteChanged(this, EventArgs.Empty); 
     } 

     remove 
     { 
      m_CanExecuteTargets -= value; 
      CanExecuteChanged(this, EventArgs.Empty); 
     } 
    } 
} 

,並在我的視圖模型(這是在上下文中綁定使事情綁定!!!):

//called in ctor where newEvent is defined : StringDelegateCommand newEvent; 
    private void setNewEventCommand() 
    { 
     newEvent = new StringDelegateCommand(); 
     newEvent.CanExecuteTargets += isThereAnotherNewEvent; 
     newEvent.ExecuteTargets += exacuteNewEvent; 
     NewEvent = newEvent; 
    } 

    void exacuteNewEvent(string message) 
    { 
     Window1 w = new Window1(); 
     w.ShowDialog(); 

    } 

當我點擊按鈕什麼都沒發生時,我做錯了什麼?有人能幫我理解我的錯誤...

謝謝...

編輯我應該提到這是什麼compliler寫道:

System.Windows.Data錯誤:40:BindingExpression路徑錯誤:在「對象未找到 'NewEvent' 屬性'''viewModel'(HashCode = 18612316)'。 BindingExpression:路徑= NewEvent; DataItem ='viewModel'(HashCode = 18612316);目標元素是'Button'(Name ='');目標屬性是'命令'(類型'ICommand')

回答

0

問題已解決:該屬性應該已公開,然後一切正常。

0

首先,檢查你的綁定是否綁定。您可以在運行時在Visual Studio的「輸出」窗口中看到綁定錯誤。或者你可以在某個地方設置一個斷點,然後在調試器中查看該按鈕的值爲Command(你需要給該按鈕命名,以便在調試器中輕鬆訪問它:<Button x:Name="TEST"將允許訪問TEST一個變量在你的Window/Control中)。其次,如果綁定是正確的,你應該在CanExecuteExecute中設置一個斷點,看看究竟發生了什麼。

希望有所幫助。

+0

我希望我的spp能夠被xmal驅動,所以當有人更換代碼時,它將是可移植的 – 2010-11-07 11:29:37