【发布时间】:2012-09-21 16:23:31
【问题描述】:
我正在构建一个 Windows 应用商店应用程序,并且我有一个 TextBox 绑定(双向模式)到我的 TaskItem 对象的字符串“title”属性。
在 UI 中的更改对此 TextBox 进行并传播回源之后,我需要进行一些处理。
我想知道是否有办法检测目标(TextBox 的 Text 属性)何时发生变化。我知道我可以通过处理 TextBox 的 LostFocus 事件来捕获此事件,但此事件是在源更新之前触发的。
更新:
绑定:
<ScrollViewer
x:Name="itemDetail"
DataContext="{Binding SelectedItem, ElementName=itemListView}">
<TextBox x:Name="itemTitle" Text="{Binding Title, Mode=TwoWay}"/>
</ScrollViewer>
类和属性:
class TaskItem
{
public string Title { get; set; }
}
我没有实现 INotifyPropertyChanged,因为我实际上不需要将更改从源传播到目标。
我能想到两种解决方案:
- 有没有办法在属性的 setter 上使用 [CallerMemberName]?如果有,我或许能够确定“标题”是由我自己的代码更改还是由于绑定而更改。
- 在 LostFocus 事件期间放弃双向绑定并手动更新源。
【问题讨论】:
-
显示绑定和属性。你实现 INotifyPropertyChange 了吗?
-
听起来您确实需要将更改从目标传播到源。你说你不需要它,但你的问题暗示你确实需要它。不?我错过了什么吗?为什么不实现 INotifyPropertyChange 并完成它?
-
我的错,我的意思正好相反,我没有实现它,因为我不需要从源传播到目标。现在编辑它。
-
我认为一个关键问题是:你想做什么以及为什么 - 通常如果你有疑问,有更好的方法来做
-
UI中显示的TaskItem的标题可以编辑。编辑后,更改应传播到源,我将在源中捕获此事件,更新本地数据库中的 TaskItem 并将这些更改发送到服务器。
标签: c# .net xaml binding microsoft-metro