2013-04-23 77 views
30

我在我的桌子上敲着我的头和这个绑定错误..我检查了BindingExpression路径错误的几个贴子,看不到任何工作与我的情况。WPF错误40 BindingExpression路径错误:在'对象'上找不到属性

无论如何,我有一个自定义控件IncrementingTextBox。我试图在用户'检查'上面的CheckBox时禁用它。

我对CheckBoxIsCheckedIsChecked属性工作正常,并正在发射,当它应该。它在ConfigurationModel上正确设置UseSensorLength属性。

但是,IncrementingTextBoxIsEnabled属性上的绑定导致BindingExpression路径错误,因此根本不会更新。

作为一个测试,我尝试在后面的代码来启用和禁用控制,它的工作原理很好,但我似乎无法让绑定工作。

这里是我的XAML代码段:

... 

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

... 
... 

<CheckBox Content="Use Sensor Length" Margin="30,6,0,0" 
      IsChecked="{Binding ConfigurationModel.UseSensorLength, Mode=TwoWay}"/> 

<local:IncrementingTextBox x:Name="video_length_textbox" Margin="0,0,0,5" 
          IsTextEnabled="False" 
          IsEnabled="{Binding ConfigurationModel.DontUseSensorLength}" 
          ValueChanged="VideoEventValueChanged"/> 

,这里是从我的ConfigurationModel片段:

public bool DontUseSensorLength 
{ 
    get { return !UseSensorLength; } 
} 

public bool UseSensorLength 
{ 
    get { return _useSensorLength; } 
    set 
    { 
     _useSensorLength = value; 
     OnPropertyChanged("UseSensorLength"); 
     OnPropertyChanged("DontUseSensorLength"); 
    } 
} 

这是在运行时,我在我的输出窗口中收到错误消息应用:

System.Windows.Data Error: 40 : BindingExpression path error: 'ConfigurationModel' property not found on 'object' ''IncrementingTextBox' (Name='video_length_textbox')'. BindingExpression:Path=ConfigurationModel.DontUseSensorLength; DataItem='IncrementingTextBox' (Name='video_length_textbox'); target element is 'IncrementingTextBox' (Name='video_length_textbox'); target property is 'IsEnabled' (type 'Boolean')

请记住,'UseSensorLength'属性绑定工作正常,但t他'DontUseSensorLength'绑定导致上面的'BindingExpression路径错误'。

+1

你可以发布错误以及从输出窗口中获得吗? – 2013-04-23 15:59:55

+0

我已将错误消息文本添加到上述发布。 – Curtis 2013-04-23 16:03:36

+2

您必须设置DataContext以反映您当前的用户控件。当你创建绑定时,它会在'ConfigurationModel.DontUseSensorLength'值的'IncrementingTextBox'的DataContext里面查找。你必须使用类似于[this]的'RelativeSource'(http://stackoverflow.com/a/11550721/1466627)。 – 2013-04-23 16:08:14

回答

83

我最近写了一些其他SO answer关于如何读取绑定错误,使它们更有意义。总而言之,将分行符添加到冒号和分号的错误消息中,并从下向上读取它。

你的错误信息是:

  • System.Windows.Data错误:40:
    • BindingExpression路径错误:对 '对象' '' IncrementingTextBox”(名称未找到 'ConfigurationModel' 属性= 'video_length_textbox')”。
    • BindingExpression:Path = ConfigurationModel.DontUseSensorLength;
  • DataItem ='IncrementingTextBox'(Name ='video_length_textbox');
  • 目标元素是'IncrementingTextBox'(Name ='video_length_textbox');
  • 目标属性是“的IsEnabled”(类型“布尔”)

这可以从底部向上为被读取:

  • 的结合失败的类型是元素的IsEnabled属性IncrementingTextBox(名为video_length_textbox)。

  • DataItemDataContext)的元素的是命名为video_length_textbox IncrementingTextBox类型的对象

  • 它试图找到的结合表达是ConfigurationModel.DontUseSensorLength

  • 而问题的结合被具有是在数据上下文对象上找不到ConfigurationModel属性IncrementingTextBox

所以你DataContext为“video_length_textbox”设置为自己,和你的IncrementingTextBox类没有叫ConfigurationModel

的公共属性。由于我没有看到你设置DataContextIncrementingTextBox在你的XAML的任何地方,退房代码为您的IncrementingTextBox类。最可能的情况是你无论是在构造

this.DataContext = this; 

或XAML中的DataContext设置到其自身

DataContext="{Binding RelativeSource={RelativeSource Self}}" 
+1

蕾切尔,你是一位美丽的天才!我是个白痴。非常感谢你的解决方案。我绑定到自我,并没有我的IncrementingTextBox类中的'ConfigurationModel'属性。再次,谢谢!出于某种原因,我无法将我的头缠住有时候。我一直尝试使用它,但似乎经常遇到愚蠢的柯蒂斯错误。最终我会弄清楚它.. – Curtis 2013-04-23 16:31:26

+5

@Curtis不用担心,一旦你了解WPF的工作原理,就会变得容易。您可能有兴趣阅读我的初学者博客文章:[您谈论什么是“DataContext”?](http://rachel53461.wordpress.com/2012/07/14/what-is-this-datacontext-你 - 说 - 中/)。总而言之,WPF应用程序有两层:数据层(DataContext)和UI层。绑定用于将数据从数据层拉入UI层,而UI层实际上只是为数据层提供了一个非常友好的用户界面。一旦你学会保持这些层分开,它变得很容易:) – Rachel 2013-04-23 16:35:38

+1

谢谢@雷切尔,这是非常有益的! – Phasma 2013-07-09 10:19:20

39

我有同样的问题,因为类的对象从中我拉出数据没”得到;并设置;在其属性上。

这并不工作:

public string Name; 

但这个工作:

public string Name{ get; set; } 
+2

是的,它不能是一个领域,它必须是一个属性。这完全是我的问题。 – seabass2020 2016-06-07 20:05:47

+0

谢谢,我被教程误导了。必须是一个财产。 – 2016-09-19 08:07:18

+2

我有同样的问题,我错过了公共访问者!有时解决方案比看起来更容易。 – Korangar 2016-10-24 16:06:02

0

我有同样的问题,在我的情况下,我用bool代替Boolean。只要我改变它,它就像预期的那样工作。

0

很少有东西的InitializeComponent前检查

1.assign值的属性在构造函数中

public partial class SampleClass: UserControl 
{ 
    public SampleClass() 
    { 
     ScenarioHeight = System.Windows.SystemParameters.WorkArea.Height - 350; 
     InitializeComponent();   


    } 

    public double ScenarioHeight { get;set;} 

2,如果它是一个用户控件确保用户控件在绑定

<ScrollViewer Name="sv" Height="{Binding Path=ScenarioHeight, ElementName=ucSampleClass}" > 
添加为元素
相关问题