как работает шаблон команды? - PullRequest
1 голос
/ 07 ноября 2010

я делаю:

       <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();

    }

Когда я нажимаю на кнопку, ничего не происходит, что я делаю не так? Может кто-нибудь помочь мне понять мою ошибку ...

спасибо ...

РЕДАКТИРОВАТЬ Я должен отметить, что это то, что пишет компилятор:

System.Windows.Data Ошибка: 40: Ошибка пути BindingExpression: свойство 'NewEvent' не найдено в 'object' '' viewModel '(HashCode = 18612316).BindingExpression: Path = NEWEVENT;DataItem = 'viewModel' (HashCode = 18612316);Целевым элементом является «Кнопка» (Имя = '');целевое свойство 'Command' (тип 'ICommand')

Ответы [ 2 ]

0 голосов
/ 07 ноября 2010

Проблема была решена: собственность должна была быть публичной, и тогда все работало просто отлично.

0 голосов
/ 07 ноября 2010

Прежде всего, проверьте, связывается ли ваша привязка вообще. Вы можете увидеть ошибки привязки в окне вывода Visual Studio во время выполнения. Или вы можете сделать где-нибудь точку останова и посмотреть в отладчике, каково значение кнопки Command (вам нужно дать имя кнопке, чтобы легко получить к ней доступ в отладчике: <Button x:Name="TEST" позволит чтобы получить доступ к TEST в качестве переменной в вашем окне / элемент управления).

Во-вторых, если привязка верна, вы должны установить точку останова в CanExecute и Execute и посмотреть, что именно происходит.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...