Кнопка включается только при нажатии другой кнопки wpf datagrid

У меня есть 2 кнопки:

На мой взгляд, MainView.xaml

<StackPanel Grid.Row="2" Grid.Column="3" VerticalAlignment="Center">
                <Button Name="wec" Height="50" Content="Podgląd" Margin="15 15 15 0" Command="{Binding ViewCommand}"/>
                <Button Height="50" Content="Drukuj" Margin="15 15 15 0"  Command="{Binding ElementName=pv, Path=PrintCommand}">
                </Button>
            </StackPanel>
            <local:PrintPreview Grid.Row="4" x:Name="pv" Grid.ColumnSpan="3" PrintingClass="{Binding Model.PrintingClass, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" PrintModel="{Binding Model.PrintingModel, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

Моя первая кнопка - команда для просмотра того, как документ будет распечатан. Вторая кнопка — команда распечатать этот документ и приведенный ниже код из PrintPreview.xaml.cs.

private DelegateCommand printCommand;
    public DelegateCommand PrintCommand
    {
        get
        {

            if (printCommand == null)
                printCommand = new DelegateCommand(print);
            return printCommand;
        }
        set
        {
            if (printCommand != value)
            {
                printCommand = value;
            }
        }
    }

    public bool IsFirstButtonClicked { get; set; }

    private bool PrintCommandCanExecute(object unused)
    {
        return this.IsFirstButtonClicked;
    }

 private void print(object x)
    {
        setPageSettings();
        WB.Print();
    }

Это не совсем так, но я надеюсь, что этого будет достаточно для решения проблемы :)

Я пытался, но не могу этого сделать, что означает: я хочу, чтобы вторая кнопка была активной только тогда, когда будет нажата первая кнопка. У вас есть какие-нибудь простые идеи, как это сделать?


person Grimmjow    schedule 23.05.2018    source источник


Ответы (1)


Во-первых, создайте логическое свойство, чтобы вы знали, когда вы нажали свою первую кнопку, давайте назовем его IsFirstButtonClicked.

В вашей команде Print вы должны добавить CommandCanExecute, например:

private bool SecondCommandCanExecute(object unused)
 {
   return this.IsFirstButtonClicked;
 }

когда вы нажимаете свою первую кнопку, вы устанавливаете для IsFirstButtonClicked (логическое свойство) значение true и повышаете свой PrintCommandCanExecute.


Я думаю, у вас есть ICommand FirstCommand. Вы должны создать такой класс:

public class RelayCommand : ICommand
{
private Action<object> _action;
private Func<bool> _func;  

public RelayCommand(Action<object> action,Func<bool> func)
{
    _action = action;
    _func = func;
}

public void RaiseCanExecuteChanged()
{
    if(CanExecuteChanged!=null)
        CanExecuteChanged(this,new EventArgs());
}

#region ICommand Members

public bool CanExecute(object parameter)
{
    if (_func != null)
       return _func();
    return true;
}



public event EventHandler CanExecuteChanged;

public void Execute(object parameter)
{
    _action(parameter);
}

#endregion
}

Теперь ваш SecondCommand должен быть RelayCommand следующим образом:

RelayCommand SecondCommand = new RelayCommand(yourCommandExecute, this.SecondCommandCanExecute)

Теперь, когда вы нажимаете кнопку FirstButton, установите для IsFirstButtonClicked значение true, а затем вызовите SecondCommand.RaiseCanExecuteChanged();

Дайте мне знать, если это помогло вам.

person Juan Carlos Rodriguez    schedule 23.05.2018
comment
Я не знаю, достаточно ли я понимаю: я добавляю логическое свойство, а затем добавляю, что команда может выполняться. А что с кнопками? Я предполагаю, что мне нужно каким-то образом выполнить эту команду, чтобы запустить это? - person Grimmjow; 23.05.2018
comment
Отредактируйте свой OP с кодом команды, и я обновлю свой ответ, чтобы уточнить его :) - person Juan Carlos Rodriguez; 23.05.2018
comment
в то же время я редактирую свой ОП :) но большое спасибо - person Grimmjow; 23.05.2018
comment
Измените это общедоступное логическое значение IsFirstButtonClicked {get; set;} to this -> private bool IsFirstButtonClicked; И когда вы нажимаете свою первую кнопку, установите для IsFirstButtonClicked значение true, а затем выполните это SecondCommand.RaiseCanExecuteChanged() (теперь я думаю, что вы назвали это PrintView) - person Juan Carlos Rodriguez; 23.05.2018