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 但我不确定是什么

谢谢

XAML 按钮组合,用于将日期选取器属性传递给方法

如果您使用的是 MVVM,则首先需要定义实现ICommandRelayCommand 对象,如下所示:

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) { }