1

可以在 WPF 中进行绑定,而源和目标是不同的属性。

类似的东西

绑定="{绑定源=MySourceProperty,目标=MyTargetProperty}"

根据要求解释我需要做什么: 除其他外,该程序允许编辑作为数据库中主键一部分的属性。如果属性刚刚被更改,那么这将不会更新 DB 值或创建副本,具体取决于我处理保存对象的方式。一个不同的目标将允许它工作(通过使用“旧”值明确指定要更新的内容)。

4

3 回答 3

1

XAML 中定义的ABinding始终以定义它的对象和属性为目标。

如果您Binding 在代码中定义,您可以/必须明确指定源和目标。本质上,这就是Binding 该类的工作方式:

Binding binding = new Binding("SourceProperty"); // Sets up the source property
myBinding.Source = mySourceObject; // sets up the source object
targetProperty.SetBinding(TargetType.TargetDepProperty, binding); // This sets the target object/binding

绑定的 XAML 标记扩展负责自动设置等式的目标端,因此它始终是您定义绑定的对象。

于 2013-04-22T16:14:53.453 回答
0

在您可以访问旧值的公共属性集中,
键是旧值
,值是来自绑定的建议值,
您可以拒绝来自绑定的值

private string key;

public string Key 
{
   get { return key; }
   set 
   {
       if (key == value) return;
       // try data update 
       bool success = updateDB();
       if (success) key = value;  // only update if success
   }
}

如果值无效,我会将上述内容与验证结合起来通知用户。
验证类

于 2013-04-22T20:33:19.357 回答
0

我会尽量回答你需要什么,而不是问不正确的 HOW

“如果属性刚刚被更改,那么这将不会更新数据库值或创建重复”

在您的属性setter 中,您应该检查set { if (this.someMember != value)输入的值是否已更改:

public event PropertyChangedEventHandler PropertyChanged;

private string someMember;
public int SomeProperty 
{
    get 
    { return this.someMember; }
    set 
    {
       if (this.someMember != value)
       {
           someMember = value;
           if (PropertyChanged != null)
           {
               PropertyChanged(this, new PropertyChangedEventArgs("SomeProperty"));
           }
     }
}

作为旁注(或题外话),
您可能会发现WPF文章中的代码项目 DataContext 在其最后下载源代码中有一个示例,当反映一个 VisualModel 属性的更新时(与另一个 VM 属性中的更新同步)

启动后立即:

在此处输入图像描述

在第一个文本框中键入的文本反映在第二个文本框中,反之亦然,在第二个文本框中键入的文本反映在第一个文本框中。

在此处输入图像描述

在 3d 文本框中键入的文本反映在第 4 个文本框(以及底部的文本块内容中),反之亦然,在第 4 个文本框中键入的文本反映在 3d 中(以及底部的文本块内容中)。

在此处输入图像描述

请注意,下载是DataCotext Inner Objects.zip解压缩到目录和解决方案的名称Bindingtoclassesstate

于 2013-04-23T04:37:34.150 回答