#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);
}
}
}