我的自定义控件名为“FileSelectDialog”,带有依赖属性:
public static readonly DependencyProperty FilePathProperty =
DependencyProperty.Register("FilePath", typeof(string), typeof(FileSelectDialog));
public string FilePath
{
get { return (string)GetValue(FilePathProperty); }
set { SetValue(FilePathProperty, value); }
}
然后我试图像这样绑定到这个依赖属性:
<controls:FileSelectDialog FilePath="{Binding FolderName}"/>
但没有任何内容,我的控件中没有显示初始文本,没有更新文本保存到'FolderName'属性!我在输出窗口中出现了这样的错误:
System.Windows.Data Error: 40 : BindingExpression path error: 'FolderName' property not found on 'object' ''FileSelectDialog' (Name='FolderSelector')'. BindingExpression:Path=FolderName; DataItem='FileSelectDialog' (Name='FolderSelector'); target element is 'FileSelectDialog' (Name='FolderSelector'); target property is 'FilePath' (type 'String')
因此,据我所知,控制尝试在自身上找到属性'FolderName,而它必须在父控件DataContext中查找它。例如,当我使用简单的文本框时:
<TextBox Text="{Binding Path=FolderName}"/>
一切正常。
答案 0 :(得分:3)
对我来说似乎是一个基本的DataContext问题 你是如何设置FileSelectDialog控件的DataContext的?似乎你在代码中将dataContext设置为'Me'/'this'或者在xaml中设置'RelativeSource Self'或类似的东西。
答案 1 :(得分:1)
我的控件中没有显示初始文字
我知道您在自定义控件中公开此属性,但是您是否使用依赖项属性中设置的值更新customcontrol中的某些控件?
您可能需要附加回调并在自定义控件的某个控件中显示DP中设置的值。
像:
public static readonly DependencyProperty FilePathProperty = DependencyProperty.Register("FilePath", typeof(string), typeof(FileSelectDialog), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.None,HandleFilePathPropertyChanged));
private static void HandleFilePathPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control= (FileSelectDialog)d;
control.SomeUIControl.Text= (string)e.NewValue;
}
如果已经这样做了,那么第二个问题是Binding中显示的错误。为此,请尝试将控件的DataContext设置为具有source属性的对象。
<controls:FileSelectDialog x:Name="customControl" FilePath="{Binding FolderName}"/>
... code-behind.
customControl.DataContext = sourceObject.
答案 2 :(得分:0)
您必须编写属性更改的回调函数
public static readonly DependencyProperty FilePathProperty =
DependencyProperty.Register("FilePath", typeof(string),
typeof(FileSelectDialog),new UIPropertyMetadata(
new PropertyChangedCallback(PropertyChanged)));
private static void PropertyChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
//Do your Stuff
}