WPF绑定不使用UpdateSourceTrigger = PropertyChanged更新

时间:2014-08-14 17:48:47

标签: c# wpf binding

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

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

<TabControl DataContext="{Binding ElementName=self, Path=Settings}">

并像TabControl一样绑定到TabControl中的属性

<TextBox Text="{Binding Path=Url, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

但是,当TextBox的内容发生更改时,这不会导致源的任何更新。我可以改变TextBox的内容,让它失去焦点等等。它只是不更新​​源代码。

2 个答案:

答案 0 :(得分:0)

Url是依赖项属性, 从XAML设置时,不会调用包装器属性setter

来自MSDN

  

其XAML处理器的当前WPF实现本质上是   依赖属性意识到。 WPF XAML处理器使用属性系统   加载二进制XAML和时的依赖属性的方法   处理属性是依赖属性。这有效   绕过属性包装器。实现自定义依赖项时   属性,你必须考虑到这种行为,应该避免   将任何其他代码放在属性包装器中除了   属性系统方法GetValue和SetValue。


如果您想要对其属性进行更改,您应该提供 PropertyChangedCallback 并在那里编写代码。

如果您对PropertyChangedCallback不熟悉,可以参考示例here。类似的东西:

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();
}

答案 1 :(得分:0)

您在({已删除的)comment中说Windowx:Name="self",但Window类没有名为Settings的属性。

如果这是附加属性,则需要通过附加属性以全名引用它,并将其包装在括号中。

例如,

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

有关详细信息,请参阅WPF Attached Property Data Binding