我有一个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的内容,让它失去焦点等等。它只是不更新源代码。
答案 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中说Window
有x:Name="self"
,但Window
类没有名为Settings
的属性。
如果这是附加属性,则需要通过附加属性以全名引用它,并将其包装在括号中。
例如,
<TabControl DataContext="{Binding ElementName=self, Path=(local:MyClass.Settings)}">
有关详细信息,请参阅WPF Attached Property Data Binding。