我正在创建一个WPF自定义控件。控件是一个时间选择器。它存在一个TextBox
,其中包含一个字符串,表示用户输入的时间(如16:35)。当该TextBox被聚焦时,将打开一个Popup
,其中包含两个独立的TextBoxes (小时)和分钟(以便于输入)。
弹出TextBoxes和主字段TextBox应该是同步的。我的意思是,当用户通过单击箭头键或键入“小时”字段来更改小时时,应该更新主文本框(包含文本16:35),反之亦然。弹出窗口中的字段仅限于接受0-9个字符。当主TextBox时间字符串更改时,将解析字符串,并更新弹出窗口中的两个字段。如果用户在主TextBox中键入无效的时间字符串,而控件无法从中提取时间和分钟来更新弹出的TextBoxes,那么我就什么也不做了。
弹出窗口中的箭头按钮绑定到命令。
我只使用自定义控件的类。我不附加任何DataContext,我只想使用依赖项属性。
我的控件具有多个依赖项属性,包含我的控件的用户视图应该使用以下依赖项属性:
TimeSpan
型
对于内部工作,我还有一些更多的依赖属性:
类型字符串的
Hour
(与Popup)Minute
中的hour TextBox绑定,类型字符串的Popup)TextBoxText
中的分钟TextBox绑定(与主TextBox绑定))
我的问题的示例:
当用户更改任何字段时,总控制字段必须同步。因此,如果弹出窗口的hour字段中的文本发生变化,主字段的时间字符串就会发生变化。为此,我使用在依赖属性元数据中定义的依赖属性更改回调。但问题是,使用此回调,您不知道更改是否来自设置DP值的类本身的控件模板(直接来自用户的操作)。这会造成恶性循环,你很快就会失去概况。这并不是说我的程序崩溃了,而是像DP这样的问题被更新了两次,这种不想要的行为。
通过用户在其中键入一个时间字符串(12:45)调用
如何解决这个问题?谁有这方面的经验,或者我做错了什么?
发布于 2020-03-29 19:03:11
我大部分时间都是这样处理的:
伪码:
callback(){
if(flag){
it's coming from program
}
else{
it's coming from user
}
}
button_event_handler(){
flag = true
do_stuff()
flag = false
}
但是,如果这不适用于您的代码,还有其他方法可以这样做。
例如,对于复杂的值(如日期时间的一部分),可以将实际的DateTime存储在通过转换器绑定到每个控件的属性中。它必须是内射的,否则整个事情就会变成一个循环。所谓内射,我指的是updown控件的每个状态必须只有一个textbox状态,反之亦然。
https://stackoverflow.com/questions/60917329
复制相似问题