gpt4 book ai didi

c# - 从ViewModel阻止DatePicker更改

转载 作者:行者123 更新时间:2023-12-03 10:48:52 24 4
gpt4 key购买 nike

我定义了一个简单的DatePicker:

<DatePicker SelectedDate="{Binding SomeDate}"/>

并且我想防止用户在某些情况下清除该值。

这是到目前为止我得到的:

public DateTime? SomeDate
{
get { return someDate; }
set
{
if (someDate != value)
{
if (value == null && someCondition)
TellTheUserHeCannotClearTheField();
else
someDate = value;
NotifyPropertyChanged(() => SomeDate);
}
}
}

尽管这可以防止基础字段被更新,但DatePicker仍显示一个空值(即“<<在此处输入文本>”),并且每次用户在其上切换时都尝试将属性更新为空。

如何强制DatePicker显示当前不变的值?

根据Doc的评论答案,让我对此进行概括。

使用下拉菜单时,可以通过这种方式拒绝日期更改(例如,如果我想限制范围)。

但是,如果您使用键盘,则您键入的任何内容都会保留在其中,并且DatePicker每次失去焦点时都会尝试提交。

最佳答案

我找到了一个相当不错的解决方法。

问题是SelectedDate属性已正确更新,但是Text属性(显示的内容)现在不同步。

因此,我写了一个助手来保持同步:

public class SelectedDateSyncBehavior
{
public static readonly DependencyProperty SyncTextProperty =
DependencyProperty.RegisterAttached("SyncText", typeof(bool),
typeof(SelectedDateSyncBehavior), new PropertyMetadata(false,
HandleSyncTextChanged));

static void HandleSyncTextChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
if ((bool)e.NewValue)
((DatePicker)d).LostFocus += SyncText;
else
((DatePicker)d).LostFocus -= SyncText;
}

static void SyncText(object sender, RoutedEventArgs e)
{
var picker = (DatePicker)sender;
if (picker.SelectedDate != null)
picker.Text = picker.SelectedDate.Value.ToShortDateString();
}

public static void SetSyncText(DatePicker element, bool value)
{
element.SetValue(SyncTextProperty, value);
}

public static bool GetSyncText(DatePicker element)
{
return (bool)element.GetValue(SyncTextProperty);
}
}

现在,我要做的就是:
<DatePicker SelectedDate="{Binding SomeDate}" 
myns:SelectedDateSyncBehavior.SyncText="True"/>

关于c# - 从ViewModel阻止DatePicker更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14461930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com