我有一个名为EnhancedTextBox
的自定义控件,它是一个具有TextBox
和Button
的UserControl。对于消费者我希望它看起来像TextBox,所以我做了以下几点:
<UserControl.Template>
<ControlTemplate TargetType="textBoxes:EnhancedTextBox">
...
<TextBox Text="{TemplateBinding Text}"...
在EnhancedTextBox中我有
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof (String), typeof (EnhancedTextBox));
public String Text
{
get { return (String) GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
然而,当我将它用作以下内容时:
<EnhancedTextBox Text="{Binding MyText, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}}" />
然后,MyText
永远不会更新,我检查EnhancedTextBox.Text
并且它为空。我错过了什么?我一直盯着这一点,无法弄清楚出了什么问题。我甚至认为可能是因为我使用相同的名称,所以创建一个名为Text1
的属性,它不起作用....
另外值得注意的是,如果我使用常规TextBox
,那么这一切都有效。所以,我很确定问题出在EnhancedTextBox
本身
答案 0 :(得分:14)
我在阅读this MSDN about TemplateBinding后想出来了。具体地,
TemplateBinding是模板场景绑定的优化形式,类似于使用 {Binding RelativeSource = {RelativeSource TemplatedParent}} 构建的Binding。
所以,我决定明确这样做......这样我就可以设置UpdateSourceTrigger
(仍然不确定为什么它不会默认为PropertyChanged
)
<TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, UpdateSourceTrigger=PropertyChanged}"....
现在它正在发挥作用。 TemplateBinding
甚至没有公开这些属性....再次,不知道为什么
答案 1 :(得分:-1)
当您注册该物业时,您错过了回传。
以下是示例代码。
public bool IsSelected
{
get { return (bool)GetValue(IsSelectedProperty); }
set { SetValue(IsSelectedProperty, value); }
}
public void IsSelectedChangedCallback()
{
//actions when property changed
}
private static void OnSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
userControl.IsSelectedChangedCallback();
}
public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register("IsSelected", typeof(bool), typeof(MyUserControl), new PropertyMetadata(new PropertyChangedCallback(OnSelectedChanged)));