C# WPF绑定未使用UpdateSourceTrigger=PropertyChanged更新

C# WPF绑定未使用UpdateSourceTrigger=PropertyChanged更新,c#,wpf,binding,C#,Wpf,Binding,我有一个TabControl,在其中我将DataContext设置为类的实例,它基本上是具有相同属性的静态类的DependencyProperties的包装器 在我的标记中,我像这样设置DataContext <TabControl DataContext="{Binding ElementName=self, Path=Settings}"> <TextBox Text="{Binding Path=Url, Mode=TwoWay, UpdateSourceTrigger

我有一个TabControl,在其中我将DataContext设置为类的实例,它基本上是具有相同属性的静态类的DependencyProperties的包装器

在我的标记中,我像这样设置DataContext

<TabControl DataContext="{Binding ElementName=self, Path=Settings}">
<TextBox Text="{Binding Path=Url, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
并像这样绑定到TabControl中的属性

<TabControl DataContext="{Binding ElementName=self, Path=Settings}">
<TextBox Text="{Binding Path=Url, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

但是,当文本框的内容更改时,这不会导致源代码的任何更新。我可以改变文本框的内容,让它放松焦点等。它只是不更新源代码

Url是一个依赖属性,当从XAML设置时,不会调用包装器属性设置器

发件人:

其XAML处理器的当前WPF实现本质上是 依赖属性感知。WPF XAML处理器使用属性系统 加载二进制XAML和 正在处理作为依赖项属性的属性。这有效地 绕过属性包装器。实现自定义依赖项时 属性,则必须说明此行为,并应避免 在属性包装器中放置除 属性系统方法GetValue和SetValue

如果您想对其已更改的属性执行某些操作,您应该提供PropertyChangedCallback并在那里编写代码

如果PropertyChangedCallback对您来说是新的,您可以参考该示例。比如:

public static readonly DependencyProperty UrlProperty = 
  DependencyProperty.Register(
  "Url",
  typeof(string),
  typeof(SettingsWrapper),
  new PropertyMetadata(OnUrlChanged)
  )
);

private static void OnUrlChanged(DependencyObject d,
                                 DependencyPropertyChangedEventArgs e)
{
    SettingsWrapper instance = (SettingsWrapper)d;
    instance.Settings.Url = e.NewValue.ToString();
}
您在“现在已删除”中说过,您的窗口具有x:Name=self,但是窗口类没有名为Settings的属性

如果这是一个附加属性,则需要通过附加属性的全名引用它,并将其括在括号中

比如说,

<TabControl DataContext="{Binding ElementName=self, Path=(local:MyClass.Settings)}">

有关更多信息,请参阅。

检查输出窗口。您看到那边有任何绑定错误吗?没有,输出窗口中没有绑定错误嗨,谢谢您的回答!我试过了,但遗憾的是,它没有改变任何行为=/OnUrlChanged是否在属性更改上受到影响?我还说我的窗口中有一个属性设置-Code@skeleten该类没有名为Settings的属性,因此WPF将无法解析绑定。如果它是附加属性,则必须使用正确的附加属性语法进行绑定。您还可以尝试在构造函数中将Window.DataContext设置为Window对象本身this.DataContext=this,并绑定到DataContext.Settings,这样应该可以工作。