C# WPF错误40 BindingExpression路径错误:在';对象';

C# WPF错误40 BindingExpression路径错误:在';对象';,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,这个装订错误把我的头撞到了桌子上。。我已经检查了一些帖子中的BindingExpression路径错误,看不到任何与我的情况相符的内容 无论如何,我有一个名为IncrementingTextBox的自定义控件。每当用户“选中”其上方的复选框时,我都会尝试禁用它 我在复选框IsChecked属性上有一个绑定,该绑定工作正常,并在应该的时候触发。它正确设置了ConfigurationModel上的UseSensorLength属性 但是,IncrementingTextBox属性上的绑定已启用会导致

这个装订错误把我的头撞到了桌子上。。我已经检查了一些帖子中的
BindingExpression
路径错误,看不到任何与我的情况相符的内容

无论如何,我有一个名为
IncrementingTextBox
的自定义控件。每当用户“选中”其上方的
复选框时,我都会尝试禁用它

我在
复选框
IsChecked
属性上有一个绑定,该绑定工作正常,并在应该的时候触发。它正确设置了ConfigurationModel上的
UseSensorLength
属性

但是,
IncrementingTextBox
属性上的绑定已启用
会导致
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"/>
以下是运行应用程序时,我在输出窗口中收到的错误消息:

System.Windows.Data错误:40:BindingExpression路径错误: 在“对象”上找不到“ConfigurationModel”属性 “递增文本框”(Name='video\u length\u textbox')。 BindingExpression:Path=ConfigurationModel.DonTusseSensorLength; DataItem='IncrementingTextBox'(Name='video\u length\u textbox');目标 元素是“IncrementingTextBox”(Name='video\u length\u textbox');目标 属性为“IsEnabled”(类型为“Boolean”)

请记住,“UseSensorLength”属性绑定工作正常,但“DonTusseSensorLength”绑定导致了上述“BindingExpression路径错误”。

我最近写了一些关于如何读取绑定错误的文章,以便使它们更有意义。总之,在冒号和分号上的错误消息中添加换行符,并从下到上阅读

您的错误消息是:

  • System.Windows.Data错误:40:
    • BindingExpression路径错误:在“对象”“递增文本框”(Name='video\u length\u textbox')上找不到“ConfigurationModel”属性
    • BindingExpression:Path=ConfigurationModel.DonTusseSensorLength
  • DataItem='IncrementingTextBox'(Name='video\u length\u textbox')
  • 目标元素是“IncrementingTextBox”(Name='video\u length\u textbox')
  • 目标属性为“IsEnabled”(类型为“Boolean”)
这可以自下而上理解为:

  • 绑定失败的原因是
    IsEnabled
    类型为
    IncrementingTextBox
    (命名为video\u length\u textbox)的元素的属性

  • 元素的
    DataItem
    DataContext
    )是类型为
    IncrementingTextBox
    命名为video\u length\u textbox的对象

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

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

因此,“视频长度文本框”的
DataContext
设置为自身,而
IncrementingTextBox
类没有名为
ConfigurationModel

由于我没有看到您在XAML中的任何位置为
IncrementingTextBox
设置
DataContext
,请查看
IncrementingTextBox
类的代码。最有可能的情况是在构造函数中将DataContext设置为自身

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


    }

    public double ScenarioHeight  { get;set;}
还是XAML

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

我也有同样的问题,因为我从中提取数据的对象的类并没有得到;并设置;关于它的性质

这不起作用:

public string Name;
但这起到了作用:

public string Name{ get; set; }

我也有同样的问题,在我的例子中,我使用了
bool
而不是
Boolean
。我一更换它,它就按预期工作。

没有什么需要检查的

1.在构造函数中初始化组件之前在属性中赋值

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


    }

    public double ScenarioHeight  { get;set;}
2.如果是usercontrol,请确保在绑定中添加usercontrol作为元素

 <ScrollViewer Name="sv" Height="{Binding Path=ScenarioHeight, ElementName=ucSampleClass}" >

当您以前试图使用XAML属性绑定不可访问或不存在的可枚举实例时,也可能发生此错误

当您使用正确的值更正
ItemsSource
时,XAML不会自动重新实现项集合

因此,当我使用
ListBox
UI-list表示时,我在属性中遇到了以下问题:


删除集合中的所有项并更正
ItemSource
值是关键。

我也有类似的经验,组合框上的ItemSource绑定不起作用

在我的例子中,这是一个小错误,但在启用跟踪消息之前很难跟踪

我只是忘记将我的列表转换为属性:(

//否:
公开列表版本;
//是的:
公共列表版本{get;set;}

也许这有助于某人…

我遇到了这个错误,我的情况很简单,只需将绑定到的字符串从private设置为public即可


粗心地写了我的支持字段。

在看了Shahid的答案后,我注意到在我的例子中,我将
DataContext
设置为
Loaded
事件中的引用,而不是构造函数中的引用。将其移动到构造函数解决了这个问题。

public Window()
public Window()
{
      this.DataContext = this;
      InitializeComponent();
}
public string Name {get;}
//xaml
<TextBlock Text="{Binding Name}"/>
{ this.DataContext=this; 初始化组件(); } 公共字符串名称{get;} //xaml

属性
Name
应该是
public
{get;}

您是否也可以发布从输出窗口获得的错误?我已将错误消息文本添加到上述发布中。您必须设置DataContext以反映当前用户控件。创建绑定时,它会查看
IncrementTex内部