我有一个DatePicker通过双向绑定绑定到支持变量。变量从null开始。我不想在设置它的值之前显示日期,所以我将它设置为Opacity=0
,顶部有一个按钮,触发点击它的DatePicker。
我遇到的问题是,如果有人点击按钮,然后接受当前日期,则不会更新绑定。如果可能的话,我希望它能够更新绑定,无论值是否已经改变。
我尝试将绑定更改为UpdateSourceTrigger=PropertyChanged
,但没有效果。
我能看到这样做的唯一方法是手动解析可视树,检索按钮打开的Flyout,然后挂钩到Closed事件。这样做的问题是,如果按下“取消”按钮而不是“接受”按钮,我将遇到问题。
有谁知道这样做的方法?我将尝试按照我建议的方式修复它,直到有人暗示,因为这是我现在能够看到的唯一方式。如果有效,我会更新。
编辑:一些代码示例
我当前的声明(减去一些格式)是这样的:
<local:DatePickerCustom Date="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Opacity="{Binding IsEmpty, Converter={StaticResource BooleanNegationToOpacityConverter}}"
x:Name="DatePicker"/>
<Button Content="Select Date"
Command="{Binding ElementName=DatePicker, Path=ClickTemplateButtonCommand}"
Visibility="{Binding IsEmpty, Converter={StaticResource BooleanToVisibilityConverter}}"/>
所以它的工作方式是,如果Value
当前为空,则只显示Button。如果它不为空,则完整的DatePicker显示。
ClickTemplateButtonCommand
已在我的DatePickerCustom
类中实现,该类直接继承自DatePicker
但添加:
public void ClickTemplateButton()
{
Button btn = (GetTemplateChild("FlyoutButton") as Button);
ButtonAutomationPeer peer = new ButtonAutomationPeer(btn);
IInvokeProvider provider = (peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider);
provider.Invoke();
}
public RelayCommand ClickTemplateButtonCommand
{
get
{
return new RelayCommand(ClickTemplateButton);
}
}
所以我希望能够听到Flyout
已关闭的事件,并告诉我们是否按下了“接受”按钮。
编辑2:
似乎DatePicker使用的弹出窗口无法以我期望的方式访问。这种方式可能无法实现。