WPF错误40 BindingExpression路径错误:'对象'上找不到属性

Cur*_*tis 44 c# wpf xaml binding

我正在敲打我的桌面上的这个绑定错误..我检查了几个BindingExpression路径错误的帖子,看不到任何与我的情况有关的东西.

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

我对该CheckBox IsChecked属性的绑定工作正常,并在它应该发射时触发.它正在UseSensorLengthConfigurationModel上正确设置属性.

但是,对IncrementingTextBox IsEnabled属性的绑定导致BindingExpression路径错误,因此根本不更新.

作为测试,我尝试在后面的代码启用和禁用控件,它工作得很好,但我似乎无法让Binding工作.

这是我的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"/>
Run Code Online (Sandbox Code Playgroud)

这是我的ConfigurationModel的一个片段:

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

public bool UseSensorLength
{
   get { return _useSensorLength; }
   set 
   { 
      _useSensorLength = value; 
      OnPropertyChanged("UseSensorLength"); 
      OnPropertyChanged("DontUseSensorLength");
   }
}
Run Code Online (Sandbox Code Playgroud)

以下是我在运行应用程序时在输出窗口中收到的错误消息:

System.Windows.Data错误:40:BindingExpression路径错误:'object'''IncrementingTextBox'(Name ='video_length_textbox')'上找不到'ConfigurationModel'属性.BindingExpression:路径= ConfigurationModel.DontUseSensorLength; DataItem ='IncrementingTextBox'(Name ='video_length_textbox'); target元素是'IncrementingTextBox'(Name ='video_length_textbox'); target属性是'IsEnabled'(类型'Boolean')

请记住,'UseSensorLength'属性绑定工作正常,但'DontUseSensorLength'绑定导致上述'BindingExpression路径错误'.

Rac*_*hel 111

我最近写了一些关于如何阅读绑定错误的其他SO 回答,以便更有意义.总而言之,在冒号和分号的错误消息中添加换行符,并从下往上读取它.

您的错误消息是:

  • System.Windows.Data错误:40:
    • BindingExpression路径错误:'object'''IncrementingTextBox'(Name ='video_length_textbox')'上找不到'ConfigurationModel'属性.
    • BindingExpression:路径= ConfigurationModel.DontUseSensorLength;
  • DataItem ='IncrementingTextBox'(Name ='video_length_textbox');
  • target元素是'IncrementingTextBox'(Name ='video_length_textbox');
  • target属性是'IsEnabled'(类型'Boolean')

这可以从下往上阅读:

  • 绑定失败是IsEnabled类型元素IncrementingTextBox(名为video_length_textbox)的属性.

  • 元素的DataItem(DataContext)是IncrementingTextBox名为video_length_textbox 的类型的对象

  • 它试图找到的绑定表达式是 ConfigurationModel.DontUseSensorLength

  • 绑定所带来的问题是ConfigurationModel在数据上下文对象上找不到该属性IncrementingTextBox

因此,您DataContext的"video_length_textbox"设置为自身,并且您的IncrementingTextBox类没有调用的公共属性ConfigurationModel

因为我没有看到你设置DataContextIncrementingTextBox在你的XAML的任何地方,检查出的代码为你的IncrementingTextBox类.最可能的情况是您在构造函数中将DataContext设置为自身

this.DataContext = this;
Run Code Online (Sandbox Code Playgroud)

或XAML

DataContext="{Binding RelativeSource={RelativeSource Self}}"
Run Code Online (Sandbox Code Playgroud)

  • @Curtis别担心,一旦你理解了WPF的工作方式,就会变得容易.您可能有兴趣阅读我的初学者博客文章:[您说的是什么"DataContext"?](http://rachel53461.wordpress.com/2012/07/14/what-is-this-datacontext-你 - 说 - 中/).总而言之,WPF应用程序有两层:数据层(`DataContext`)和UI层.绑定用于将数据从数据层提取到UI层,而UI层实际上只是用于数据层的非常用户友好的界面.一旦你学会将这些图层分开,就变得容易:) (8认同)
  • 瑞秋,你是一个美丽的天才!我是个白痴.非常感谢您的解决方案.我绑定到self并且在IncrementingTextBox类中没有'ConfigurationModel'属性.再次,谢谢!出于某种原因,我有时无法绕过装订.我试着一直使用它,但似乎经常遇到愚蠢的柯蒂斯错误.最终我会弄明白的.. (3认同)
  • 谢谢@Rachel,这非常有帮助! (2认同)

小智 64

我有同样的问题,因为我从中提取数据的对象类没有得到; 并设定; 在它的属性.

这不起作用:

public string Name;
Run Code Online (Sandbox Code Playgroud)

但这有效:

public string Name{ get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 是的,它不能是一个领域,它必须是一个属性.这完全是我的问题. (6认同)
  • 我有同样的问题,我错过了公共访问者!有时解决方案比看起来容易. (4认同)
  • 哇,我花了 2 个多小时试图找出原因,这是因为我的对象中只有字段而不是属性。0_o (4认同)
  • 只花了 3 小时在这个废话上 (4认同)
  • 我盯着雷切尔的答案好久了。然后我读了你的和* facepalm *。属性...不是字段。 (2认同)

Trư*_*ánh 6

public Window()
{
      InitializeComponent();
      this.DataContext = this;
}
public string Name {get;}
//xaml
<TextBlock Text="{Binding Name}"/>
Run Code Online (Sandbox Code Playgroud)

属性Name应该是public{ get; }


uce*_*ern 5

我有过类似的经历,组合框上的 ItemsSource 绑定不起作用。

在我的情况下,这是一个小错误,但在启用跟踪消息之前很难跟踪。

我只是忘记把我的 List 变成一个属性 :(

// NOPE:
public List<string> Versions;
// YEP:
public List<string> Versions { get; set; }
Run Code Online (Sandbox Code Playgroud)

也许这有助于某人...

  • 我猜你错过了 Janiiik 的解决方案? (3认同)