时间选择器更新源触发属性更改不会改变值。

4

我正在将一个WPF用户控件托管在Windows表单中。

在WPF用户控件中,我正在使用来自WpfToolkit.Extended的时间选择器。

如果我使用向上或向下箭头或只是在文本字段中输入时间,则源未更新,尽管我正在使用Updatesourcetrigger = propertychanged。

当我在下拉列表中选择时间时,一切正常。这是工具包的命名空间。

xmlns:xctk="clr-namespace:Xceed.Wpf.Toolkit;assembly=WPFToolkit.Extended"

这是TimePicker的XAML代码。
  <xctk:TimePicker  Format="LongTime" TimeInterval="00:15:00.000" Value="{Binding Path=StartTime, UpdateSourceTrigger=PropertyChanged}" ></xctk:TimePicker>

如果我在未将焦点变换到WPF用户控件中的另一个控件之前单击WPF用户控件外部,则绑定时间不会更新。

您有什么想法可以解决这个问题吗?

3个回答

4

找到了解决这个问题的方法: 我给 TimePicker 赋予了一个名称(在这种情况下是 'tpFrom'),然后使用了 TimePicker 上的 TextBoxBase.TextChanged 事件。 现在 Xaml 的代码如下:

<xctk:TimePicker Name="tpFrom"  Format="LongTime"  TextBoxBase.TextChanged="TimePicker_TextChanged"  TimeInterval="00:15:00.000" Value="{Binding Path=StartTime, UpdateSourceTrigger=PropertyChanged}"></xctk:TimePicker>

在我们的事件处理程序中,代码后台将聚焦于我们的时间选择器。
  private void TimePicker_TextChanged(object sender, TextChangedEventArgs e)
    {
        tpFrom.Focus();            
    }

现在每次文本更改时,值也会更改,问题得到解决 :-)

在我的情况下,当TextChanged事件发生时,必须将焦点移开并重新聚焦到DateTimePicker才能触发事件链: SubView.Focus(); SubView.dtpSince.Focus(); - fartwhif

1

聚焦解决方案存在问题,它会立即更改光标以标记小时,这将阻止输入大于9分钟。

为了避免这种情况,您可以使用计时器并直接设置值,而不是使用聚焦Hack。

private System.Timers.Timer _delayedDateChangeTimer;
private DateTime _tmpNewDate;

public CtorView()
{
    InitializeComponent();

    _delayedDateChangeTimer = new System.Timers.Timer();
    _delayedDateChangeTimer.Elapsed += DelayedDateChangeElapsed;
    _delayedDateChangeTimer.Interval = 700;
}

private void DelayedDateChangeElapsed(object sender, ElapsedEventArgs e)
{
    App.Current.Dispatcher.BeginInvoke(new Action(() => { tpTargetTime.Value = _tmpNewDate; }));
    _delayedDateChangeTimer.Stop();
}

private void tpTargetTime_TextChanged(object sender, TextChangedEventArgs e)
{
    if (DateTime.TryParse(tpTargetTime.Text, out _tmpNewDate) && tpTargetTime.Value != _tmpNewDate)
        _delayedDateChangeTimer.Start();
}

0

TimePicker有Text属性吗?如果有的话,尝试绑定到那个属性。

我认为这种行为可能是为了防止您在输入时绑定到错误的日期时间。我猜想当失去焦点时,它会尝试设置属性并进行错误检查。如果它在您输入时执行此操作,它将不断更改值,无论您做出何种更改(例如删除一个字符)。

您是否有特定的输入需求?


它没有文本属性。 - Gert Hermans
问题并不是打字(在这个时间选择器中不太好),而是使用箭头增加和减少小时等... 如果我在 WPF 用户控件外按保存按钮,则更改不会反映在值中。 - Gert Hermans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接