簡體   English   中英

MVVM中的WPF擴展工具包DateTimePicker更改值事件

[英]WPF Extended Toolkit DateTimePicker change value event in MVVM

我有個問題。

我正在使用2 Extended Toolkit DateTimePicker,mu目標是如果您更改時間,則一個開始選擇器結束選擇器將在5分鍾后隨時間更新,反之亦然,如果我更改結束開始時的值將返回5分鍾。

我嘗試使用ValueChanged屬性,但不幸的是,它最終出現如下異常:

輸入“ System.Windows.Data.Binding”元素的值的操作觸發了異常。

這些控件的Xaml很簡單:

<xctk:DateTimePicker Value="{Binding StartEventDatetime}" ValueChanged="{Binding UpdateEndDatetime}"
                                             Format="Custom" FormatString="yyyy/MM/dd HH:mm:ss" Watermark="Start Date" Foreground="White"/>
<xctk:DateTimePicker Value="{Binding EndEventDatetime}" ValueChanged="{Binding UpdateStartDatetime}"
                                             Format="Custom" FormatString="yyyy/MM/dd HH:mm:ss" Watermark="End date" Foreground="White"/>

和命令綁定:

public ICommand UpdateStartDatetime => new Command(p => { EndEventDatetime = EndEventDatetime.AddMinutes(CurrentSamplesViewModel.MinuteTimeInterval); });
public ICommand UpdateEndDatetime => new Command(p => { StartEventDatetime = StartEventDatetime.AddMinutes(CurrentSamplesViewModel.MinuteTimeInterval); });

有沒有辦法創建這樣的事件?

看一下觸發觸發器 與他們一起,您可以通過ui中的特定事件在vm中調用命令

Ive根據Interaction提出了一個解決方案。行為xaml如下所示:

<xctk:DateTimePicker Value="{Binding StartEventDatetime}" Format="Custom" FormatString="yyyy/MM/dd HH:mm" Watermark="Start Date" Foreground="White">

<i:Interaction.Behaviors>
  <businessLogic:PropertyChangeBehavior DependencyPropertyName="Value" PropertyChangedCommand="{Binding UpdateEndDatetimeCommand}"/>
</i:Interaction.Behaviors>

</xctk:DateTimePicker>

   <xctk:DateTimePicker Value="{Binding EndEventDatetime}" Format="Custom" FormatString="yyyy/MM/dd HH:mm" Watermark="End date" Foreground="White">

         <i:Interaction.Behaviors>
              <businessLogic:PropertyChangeBehavior DependencyPropertyName="Value" PropertyChangedCommand="{Binding UpdateStartDatetimeCommand}"/>
          </i:Interaction.Behaviors>

     </xctk:DateTimePicker>

PropertyChangedCommand的邏輯:

公共類PropertyChangeBehavior:行為{公共靜態只讀DependencyProperty PropertyChangedCommandProperty = DependencyProperty.Register(“ PropertyChangedCommand”,typeof(ICommand),typeof(PropertyChangeBehavior),new PropertyMetadata(null,ApplyChanged));

    public static readonly DependencyProperty DependencyPropertyNameProperty = DependencyProperty.Register(
        "DependencyPropertyName", typeof(string),
        typeof(PropertyChangeBehavior), new PropertyMetadata(string.Empty, ApplyChanged));

    private DependencyPropertyDescriptor descriptor;

    public ICommand PropertyChangedCommand
    {
        get => (ICommand)GetValue(PropertyChangedCommandProperty);
        set => SetValue(PropertyChangedCommandProperty, value);
    }

    public string DependencyPropertyName
    {
        get => (string)GetValue(DependencyPropertyNameProperty);
        set => SetValue(DependencyPropertyNameProperty, value);
    }

    private static void ApplyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is PropertyChangeBehavior behavior)
        {
            behavior.Setup();
        }
    }

    protected override void OnAttached()
    {
        Setup();
    }

    protected override void OnDetaching()
    {
        if (descriptor != null && AssociatedObject != null)
        {
            descriptor.RemoveValueChanged(AssociatedObject, OnPropertyValueChanged);
        }
    }

    private void Setup()
    {
        if (descriptor != null || string.IsNullOrEmpty(DependencyPropertyName) || AssociatedObject == null)
        {
            return;
        }

        descriptor = DependencyPropertyDescriptor.FromName(DependencyPropertyName, AssociatedObject.GetType(),
            AssociatedObject.GetType());

        descriptor?.AddValueChanged(AssociatedObject, OnPropertyValueChanged);
    }

    private void OnPropertyValueChanged(object sender, EventArgs e)
    {
        object value = AssociatedObject.GetValue(descriptor.DependencyProperty);
        if (PropertyChangedCommand == null || !PropertyChangedCommand.CanExecute(value))
        {
            return;
        }

        PropertyChangedCommand.Execute(value);
    }
}

並且命令保持不變,並且可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM