wpf 如何从控件中获取值并将其作为参数传递给命令?

uinbv5nw  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(218)

我有一个DatePicker控件,也有一个命令来加载特定日期的数据。我如何获得DatePicker的值并将其传递给命令?
我的ViewModel类现在:

public class MainWindowViewModel
{
    private readonly JiraHandler jiraHandler;
    private DateTime date;

    public ICommand DateChosen { get; }

    public ObservableCollection<Issue> Issues { get; private set; } = new ObservableCollection<Issue>();

    public MainWindowViewModel(JiraHandler jiraHandler)
    {
        this.jiraHandler = jiraHandler;
    }
}
idv4meu8

idv4meu81#

XAML部分在结尾处应该类似于这样:

<DatePicker x:Name="MyDatePicker">

        </DatePicker>

        <Button Content="Click me!"
                Command="{Binding Path=DateChosen}"
                CommandParameter="{Binding Path=DisplayDate, ElementName=MyDatePicker}"/>

在视图模型ICommand中:

private ICommand _dateChosen ;

    public ICommand DateChosen 
    {
        get
        {
            if (_dateChosen == null)
            {
                _dateChosen = new RelayCommand(param => OnDateChosen(param));
            }
            return _dateChosen ;
        }
    }

对于RelayCommand的实现,我可以推荐此链接:RelayCommand
在OnDateChosen(对象param)方法上,可以将"param"参数强制转换为DateTime。
祝你好运!

qqrboqgw

qqrboqgw2#

我推荐社区工具包mvvm,它提供了icommand、messenger、基类的relaycommand实现,并进行代码生成。
https://learn.microsoft.com/en-us/dotnet/communitytoolkit/mvvm/
下面是一个简单的示例,让您了解它是如何工作的:

<StackPanel>
        <DatePicker Name="DateSelection"
                    SelectedDate="{Binding DateSelected}"/>
        <Button Content="DoSomething"
                Command="{Binding DateChosenCommand}"
                CommandParameter="{Binding SelectedDate, ElementName=DateSelection}"/>
    </StackPanel>

以及视图模型:

public partial class MainWindowViewModel : ObservableObject
{

    private readonly JiraHandler jiraHandler;

    [ObservableProperty]
    private DateTime? dateSelected;

    partial void OnDateSelectedChanged(DateTime? newDate)
    {
        // Fires when bound Date value changes
    }

    [RelayCommand]
    private void DateChosen(DateTime? selectedDate)
    {
        if (selectedDate != null)
        {
            dateSelected = (DateTime)selectedDate;
        }
    }

    [ObservableProperty]
    private ObservableCollection<Issue> issues = new ObservableCollection<Issue>();

    public MainWindowViewModel(JiraHandler jiraHandler)
    {
        this.jiraHandler = jiraHandler;
    }

您应该使用日期选择器中的DateSelected。这是一个可以为空的DateTime吗?
您可能会绑定选定的日期,命令将引用该值。
注:
总是在任何视图模型上实现inotifypropertychanged(以避免内存泄漏)。ObservableObject就是这样做的。还有一个ObservableValidator提供验证支持。
公共属性在另一个分部类文件中生成。
你可以自动获得你可以为属性改变或属性改变提供的方法。这允许你在日期选择器中选择日期时方便地操作。

相关问题