【发布时间】:2018-02-05 15:51:37
【问题描述】:
我有一个自定义的TextBox 控件,它继承System.Windows.Controls.TextBox 并实现INotifyPropertyChanged 接口。
public partial class V3TextBox : TextBox, INotifyPropertyChanged
它有一个自定义的OriginalValue 属性,并且覆盖了基础Text 属性。
我想象它的工作方式是将Text 和OriginalValue 绑定到两个不同的字符串属性,并将其Background 设置为,比如说,如果这两个字符串不相同,则设置为黄色并返回到如果它们再次变得相同,则为白色。
这些是我的 Text 和 PropertyChanged 属性:
private Binding PropertyChangedBinding = new Binding()
{
Path = new PropertyPath("ChangedPropertyBackground")
};
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
private string text { get; set; } = "";
public new string Text
{
get
{
return text;
}
set
{
text = value;
if (value == originalValue)
BindingOperations.ClearBinding(this, BackgroundProperty);
else
SetBinding(BackgroundProperty, PropertyChangedBinding);
OnPropertyChanged("Background");
}
}
现在,问题可能在于为我的OriginalValue 属性设置DependencyProperty。
它们看起来像这样:
private string originalValue;
public string OriginalValue
{
get
{
return (string)GetValue(TestProperty);
}
set
{
originalValue = value;
SetValue(TestProperty, value);
}
}
public static readonly DependencyProperty TestProperty =
DependencyProperty.Register("OriginalValue", typeof(string),
typeof(V3TextBox), new FrameworkPropertyMetadata(default(string)));
private void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
SetValue(TestProperty, e.NewValue);
}
XAML 中的控件用法如下所示:
<Ctrls:V3TextBox x:Name="txtBxDiscountNote"
Text="{Binding EditedNote, Mode=TwoWay, NotifyOnTargetUpdated=True}"
OriginalValue="{Binding OriginalNote, Mode=TwoWay}"/>
DataContext 设置在 XAML 中。
问题是OriginalValue 属性永远不会更改,它始终是null,并且更改Background 的代码仅在Text 属性以编程方式更改时触发,而不是通过GUI 输入。使用IValueConverter 会更容易实现吗?一个表单上将有大约 30 个这样的控件。
【问题讨论】:
-
请注意,像
originalValue这样的依赖属性有一个“支持字段”是没有意义的。还有强制性的命名约定。您的 DependencyProperty 字段应为OriginalValueProperty,而不是TestProperty。除此之外,您没有在任何地方注册 OnTextPropertyChanged 回调。请仔细阅读Custom Dependency Properties。 -
您真的打算在 Text 更改时更新 OriginalValue(正如 OnTextPropertyChanged 方法所暗示的那样)?这有意义吗?
-
另外说明,实现 INotifyPropertyChanged 也是没有意义的。背景是一个依赖属性,因此已经支持更改通知。
-
另外,在文本绑定上设置
Mode=TwoWay是多余的。默认情况下,Text 属性已经绑定了 TwoWay。NotifyOnTargetUpdated=True也不是必需的,除非您订阅了 Bindings 的 TargetUpdated 事件,而您显然没有这样做。 -
TestProperty变成了OriginalValueProperty,谢谢。
标签: wpf xaml binding dependency-properties ivalueconverter