无法使用控件依赖属性

时间:2011-11-17 08:19:41

标签: c# wpf dependency-properties

我的自定义控件名为“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}"/>

一切正常。

3 个答案:

答案 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       
    }