Как передать целое число через команду wpf?

#c# #wpf

Вопрос:

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

Месячный обзор

     <ListView ItemsSource="{Binding CurrentMonth.Days}" Grid.Row="1">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Button Content="{Binding DayNumber}"  Grid.Row="1" Height="20" Width="100"
                    Command="{Binding ToDayViewCommand}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
 

Модель месячного просмотра

 public class MonthViewModel : ViewModelBase
{
    private readonly NavigationStore _navigationStore;

    private Month _currentMonth;

    public Month CurrentMonth
    {
        get { return _currentMonth; }
        set 
        { 
            _currentMonth = value;
            OnPropertyChanged("CurrenMonth");
        }
    }

    public void ToDayView(object thing)
    {
        // use parameter as day number
        int dayNumber = 25;

        // find the Day object with that day number
        for(int i = 0; i < CurrentMonth.Days.Count; i  )
        {
            if(CurrentMonth.Days[i].DayNumber == dayNumber)
            {
                // give it to the view model to be displayed
                _navigationStore.CurrentViewModel = new DayViewModel(CurrentMonth.Days[i], _navigationStore);
            }
        }
    }

    public BasicCommand ToDayViewCommand { get; set; }

    public MonthViewModel(Month currentMonth, NavigationStore navigationStore)
    {
        CurrentMonth = currentMonth;
        _navigationStore = navigationStore;
        ToDayViewCommand = new BasicCommand(ToDayView);

    }
}
 

Базовая команда

 public class BasicCommand : CommandBase
{
    readonly Action<object> _execute;

    public BasicCommand(Action<object> execute)
    {
        _execute = execute;
    }

    public override bool CanExecute(object parameter) => true;

    public override void Execute(object parameter)
    {
        _execute.Invoke(parameter);
    }
}
 

Ответ №1:

Вы можете определить параметр команды в своем коде XAML:

 <Button Content="{Binding DayNumber}"  Grid.Row="1" Height="20" Width="100"
    Command="{Binding ToDayViewCommand}" CommandParameter="25" />
 

Обратите внимание, что CommandParameter это свойство зависимости, поэтому вы также можете использовать привязку:

 <Button Content="{Binding DayNumber}"  Grid.Row="1" Height="20" Width="100"
    Command="{Binding ToDayViewCommand}" CommandParameter="{Binding AmountDays}" />
 

В методе, который вызывается вашей командой, вы должны привести объект к int. Обратите внимание, что ваш параметр является строкой, если вы называете его, как в моем первом фрагменте кода, следовательно, вы должны использовать int.Parse :

  public void ToDayView(object thing)
    {
        // use parameter as day number
        int dayNumber = int.Parse(thing.ToString());

        // find the Day object with that day number
        for(int i = 0; i < CurrentMonth.Days.Count; i  )
        {
            if(CurrentMonth.Days[i].DayNumber == dayNumber)
            {
                // give it to the view model to be displayed
                _navigationStore.CurrentViewModel = new DayViewModel(CurrentMonth.Days[i], _navigationStore);
            }
        }
    }