XAML 按钮组合,用于将日期选取器属性传递给方法
本文关键字:属性 方法 选取 日期 组合 按钮 用于 XAML | 更新日期: 2023-09-27 18:34:03
我对XMAL很陌生,但已经设法拼凑出一种从SQL检索数据并填充数据网格的形式。为了扩展这一点,我只想返回基于两个日期的数据。我创建了一个方法GetAllActionLogsBetweenDates(),它有两个属性QueryFromDate,QueryToDate。
当单击FindButton时,我需要将日期选择器中的2个日期传递给GetAllActionLogsBetweenDates方法。
我的 XAML 如下所示
<StackPanel Height="114"
Orientation="Vertical"
HorizontalAlignment="Left"
Name="StackPanel1"
VerticalAlignment="Top"
Width="507">
<DatePicker Height="25"
SelectedDate="{Binding QueryFromDate, Mode=TwoWay}"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Width="115"
x:Name="DateFrom"
Margin="5"/>
<DatePicker Height="25"
SelectedDate="{Binding QueryToDate, Mode=TwoWay}"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Width="115"
Margin ="5 "
x:Name="DateTo"/>
<Button Content="Find"
x:Name="FindButton"
Command="{Binding ?????}"
Height="23"
Margin="5"
Width="75"
HorizontalAlignment="Left" />
</StackPanel>
我想我必须在 Command="{Binding ?????}" 元素中引用我的方法,大概是 2 个属性 QueryFromDate、QueryToDate 但我不确定是什么
谢谢
如果您使用的是 MVVM,则首先需要定义实现ICommand
的 RelayCommand
对象,如下所示:
public class RelayCommand : ICommand
{
private Predicate<object> m_canExecute;
private Action<object> m_execute;
public RelayCommand(Action<object> execute)
{
m_execute = execute;
}
public RelayCommand(Predicate<object> canExecute, Action<object> execute)
{
m_canExecute = CanExecute;
m_execute = execute;
}
public bool CanExecute(object parameter)
{
if (m_canExecute == null)
{
return true;
}
return m_canExecute(parameter);
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
if (m_execute != null)
{
m_execute(parameter);
}
}
}
然后,您需要在视图模型中为按钮创建一个命令。像这样:
public class MainViewModel : INotifyPropertyChanged
{
// INotifyPropertyChanged implementation
public ICommand GetAllActionLogsBetweenDatesCommand { get; set; }
public MainViewModel()
{
GetAllActionLogsBetweenDatesCommand = new RelayCommand(GetAllActionLogsBetweenDates_Execute);
}
private void GetAllActionLogsBetweenDates_Execute(object parameter)
{
try
{
var stringList = parameter as string[];
DateTime fromDate = DateTime.Parse(stringList[0]);
DateTime toDate = DateTime.Parse(stringList[1]);
// Query the data.
}
catch (Exception ex)
{
}
}
}
现在,由于您要将多个参数传递给命令,因此可以使用IMultiValueConverter
来选择两个日期并将它们传递给 ViewModel。转换器的样子如下:
public class ICommandMultiDateConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return new string[] { values[0].ToString(), values[1].ToString() };
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
最后,在 XAML 中创建此转换器的实例并将其绑定到按钮:
<Window.Resources>
<myNamespace:ICommandMultiDateConverter x:Key="multiDateConverter"/>
</Window.Resources>
<DatePicker Name="fromDatePicker"></DatePicker>
<DatePicker Name="toDatePicker"></DatePicker>
<Button Content="Hello World">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource ResourceKey=multiDateConverter}">
<Binding ElementName="fromDatePicker" Path="Text"></Binding>
<Binding ElementName="toDatePicker" Path="Text"></Binding>
</MultiBinding>
</Button.CommandParameter>
<Button.Command>
<Binding Path="GetAllActionLogsBetweenDatesCommand"></Binding>
</Button.Command>
</Button>
如果您使用的是 ViewModel,则需要实现ICommand
并在 ViewModel 类中创建命令。
这个问题有一个您可以使用的示例实现:如何将 WPF 按钮绑定到 ViewModelBase 中的命令?
或者,如果您只是使用代码隐藏 (.xaml.cs),则可以使用 Click
事件:
<Button Content="Find" Click="FindClicked" />
然后,将 FindClicked
方法添加到代码隐藏中:
void FindClicked(object sender, RoutedEventArgs e) { }