我有一个使用dependencyproperty的usercontrol和一个窗口的半工作绑定的错误案例,其中我有一个自定义类作为datacontext中的模型。
我的窗口
<src:BaseWindow x:Class="Levscan.Wpf.Controls.DialogWindows.SystemSettingsDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:src="clr-namespace:Levscan.Wpf.Controls.Abstract"
xmlns:ctrl_io="clr-namespace:Levscan.Wpf.Controls.Controls.IO"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d">
<ctrl_io:DirectoryBrowser Width="250" SelectedPath="{Binding Path=PathInbox, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/>
</src:BaseWindow>
我的用户控件
<UserControl Name="DirectoryBrowserUC" x:Class="Levscan.Wpf.Controls.Controls.IO.DirectoryBrowser"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="53" d:DesignWidth="392">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="8*" />
<ColumnDefinition Width="2*" />
</Grid.ColumnDefinitions>
<TextBox Text="{Binding ElementName=DirectoryBrowserUC, Path=SelectedPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" Style="{StaticResource TextBoxInError}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Column="0" Margin="5,0" />
<Button Margin="5,0" Content="..." Grid.Column="1" Click="OnBrowse_Click" />
</Grid>
我的用户控制 - 代码隐藏
public partial class DirectoryBrowser : UserControl
{
public static readonly DependencyProperty SelectedPathProperty =
DependencyProperty.Register("SelectedPath", typeof(string), typeof(DirectoryBrowser));
public string SelectedPath
{
get { return this.GetValue(SelectedPathProperty) as string; }
set { this.SetValue(SelectedPathProperty, value); }
}
}
当我启动窗口时,我加载了一个继承INotifyPropertyChanged接口的自定义类。 设置新数据时,我的属性为NotifyPropertyChanged()。
当我在usercontrol中启动我的文本框时,我的窗口中的数据和windows DataContext中的自定义类都会更新(到目前为止一切都很好)。
然而我注意到当我编辑文本框时,直接(输入新文本)或使用旁边的按钮并选择带有Windows目录对话框的新路径,我的DataContext中的属性不会更新。
我尝试了各种绑定变体但没有任何效果,无论是加载了数据还是我都无法更改数值。
我怀疑某处我的绑定只是一点点。
更新
在上面的代码中我需要的所有接缝都是在我的窗口上为控件添加Mode = TwoWay。因为我把东西扔掉了,并且添加了我从来没有注意到那是唯一丢失的东西所以当我真的有它的时候还有别的东西被关闭了。
答案 0 :(得分:2)
在SelectedPath的绑定中添加Mode = TwoWay。自定义依赖项属性的默认绑定模式是OneWay。
这不是神奇的。首先,依赖项属性上有一个默认绑定模式。当你编写自己的依赖属性时,默认的“默认绑定模式”是OneWay,你可以像Clemens建议的那样将它覆盖为TwoWay。如果未在用户控件级别指定绑定模式,WPF将使用默认绑定模式,即OneWay。这解释了为什么数据上下文没有得到更新。
第二个绑定模式是在目标而不是源上定义的,因此无论SelectedPath上的默认绑定模式是什么,它都将从TextBox更新,因为Text属性的默认绑定模式是双向绑定(丢失焦点)。
总之。只需在用户控件级别上明确添加双向绑定或覆盖FrameworkPropertyMetadata并提供默认的双向绑定将解决您的问题。