如何在属性更新后调用方法

Ray*_*nan 7 c# mvvm windows-community-toolkit

我有一个绑定到 viewmodel.SelectedDate 的 DatePicker 控件。我没有使用 propfull,而是使用 CTK [ObservableProperty]。当我选择一个新日期时,我想调用另一个函数,该函数根据该新日期获取新的数据集。还有其他注释吗?

    /// Set by the Date Control on the form
    [ObservableProperty]
    //[AlsoCallThisFunction(DisplayBookings)]
    public DateTime bookingDate;

    ///I want to call this for a fresh dataset
    ///after the bookingDate is set
    void DisplayBookings()
    {
        GoToDatabaseAndGetNewRecordset(bookingDate);
    }
Run Code Online (Sandbox Code Playgroud)

旧的做法:

    //private DateTime bookingDate;

    //public DateTime BookingDate
    //{
    //    get { return bookingDate; }
    //    set { 
    //        bookingDate = value;
    //        DisplayBookings();

    //    }
    //}
Run Code Online (Sandbox Code Playgroud)

McN*_*ets 9

您可以覆盖OnPropertyChangingOnPropertyChanged事件,并在那里调用您的方法。

请记住,如果您设置了绑定,则UpdateSourceTrigger=PropertyChanged某些更改可能仍在进行。

protected override void OnPropertyChanged(PropertyChangedEventArgs e)
{
    base.OnPropertyChanged(e);

    if (e.PropertyName == nameof(BookingDate))
    {
        DisplayBookings();
    }
}
Run Code Online (Sandbox Code Playgroud)

更新

从v8.0.0 Preview 3开始,您可以使用部分属性更改方法

引用自博客:

当使用 [ObservableProperty] 生成可观察属性时,MVVM Toolkit 现在还将生成两个没有实现的部分方法:On<PROPERTY_NAME>Changing 和 On<PROPERTY_NAME>Changed。这些方法可用于在属性更改时注入额外的逻辑,而无需回退到使用手动属性。请注意,由于这两个方法是部分方法、返回 void 且没有定义,因此如果未实现它们,C# 编译器将完全删除它们,这意味着在不使用时它们将消失并且不会给应用程序增加任何开销

然后你可以将其重写为:

[ObservableProperty]
public DateTime bookingDate;

partial void OnBookingDateChanged(DateTime bookingDate)
{
    DisplayBookings();
}
Run Code Online (Sandbox Code Playgroud)