不能使用control的依赖属性
本文关键字:依赖 属性 control 不能 | 更新日期: 2023-09-27 18:14:49
我有一个自定义控件名为"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}"/>
一切正常
对我来说似乎是一个基本的DataContext问题你如何设置你的FileSelectDialog控件的DataContext ?似乎您将代码中的dataContext设置为'Me'/'this'或在xaml中使用'RelativeSource Self'或类似的东西。
控件中没有显示初始文本
我知道你在自定义控件中暴露了这个属性,但是你是否在你的依赖属性中设置了值来更新自定义控件中的一些控件?
您可能需要附加一个回调,并在您的自定义控件的某些控件中显示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.
您必须编写属性更改回调函数
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
}