【问题标题】:Notify source of target changes in TwoWay Binding通知双向绑定中目标更改的源
【发布时间】: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


【解决方案1】:
class TaskItem, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    internal void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    private string title;
    public string Title 
    { 
       get { return title; } 
       set 
       { 
           if (title == value) return;
           title = value;
           NotifyPropertyChanged("Title");
       }
    }
    public TaskItem (string -title) 
    { title = _title; }  
    // does not fire setter title lower case 
    // but the UI will have this value as ctor fires before render 
    // so get will reference the assigned value of title 
}

Constructor Design

【讨论】:

  • 拥有两个 setter(一个供公共使用,另一个用于绑定)有点太 hacky,但它可以工作。
  • 技术上不是两个二传手。标题=标题;是分配一个成员变量。它是 MSDN 站点上成员设计指南 \ 构造函数设计的模式。我不同意这是一个黑客。这是成员变量的目的之一。它不正是你想要的吗?
  • 这是否意味着我只能通过构造函数来分配标题?如果我理解正确,UI 将绑定到“Title”,而我的代码必须使用 new TaskItem("hi")
  • 您可以在任何地方指定标题。不同之处在于,如果您在 ctor Title 中分配它,它将返回 title 的值,它首先呈现。之后,如果您更改标题,则不会通知绑定的 UI 对象。如果您更改 Title,则通知 UI 对象(如果您实现 INotifyPropertyChanged)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
相关资源
最近更新 更多