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

时间:2013-04-23 15:52:25

标签: c# wpf xaml binding

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

无论如何,我有一个名为IncrementingTextBox的自定义控件。我试图在用户“检查”其上方的CheckBox时禁用它。

我对CheckBox IsChecked属性的绑定工作正常,并且应该在它应该触发时触发。它正在ConfigurationModel上正确设置UseSensorLength属性。

但是,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"/>

以下是我的ConfigurationModel的一个片段:

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

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

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

  

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

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

9 个答案:

答案 0 :(得分:100)

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

您的错误消息是:

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

这可以从下往上阅读:

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

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

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

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

因此,您的DataContext for“video_length_textbox”设置为自身,而您的IncrementingTextBox类没有名为ConfigurationModel的公共属性

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

中将DataContext设置为自身
this.DataContext = this;

或XAML

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

答案 1 :(得分:59)

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

这不起作用:

public string Name;

但这有效:

public string Name{ get; set; }

答案 2 :(得分:2)

我遇到了同样的问题,在我的情况下,我使用的是bool而不是Boolean。一旦我改变它,它就像预期的那样工作。

答案 3 :(得分:2)

很少要检查

1.在构造函数

中的InitializeComponent之前对属性中的值进行分配
 public partial class SampleClass: UserControl
{
    public SampleClass()
    {
        ScenarioHeight = System.Windows.SystemParameters.WorkArea.Height - 350;
        InitializeComponent();           


    }

    public double ScenarioHeight  { get;set;}

2.如果是usercontrol,请确保在绑定

中添加userControl作为Element
 <ScrollViewer Name="sv" Height="{Binding Path=ScenarioHeight, ElementName=ucSampleClass}" >

答案 4 :(得分:2)

当您以前尝试使用XAML属性绑定不可访问或不存在的Enumerable实例时,也可能发生此错误<ItemsSource>

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

因此,当我使用ListBox UI - 列表表示时,我在属性中遇到了这个问题:

enter image description here

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

答案 5 :(得分:2)

def include_docs_urls(
        title=None, description=None, schema_url=None, urlconf=None,
        public=True, patterns=None, generator_class=SchemaGenerator,
        authentication_classes=api_settings.DEFAULT_AUTHENTICATION_CLASSES,
        permission_classes=api_settings.DEFAULT_PERMISSION_CLASSES,
        renderer_classes=None):
# this is the declaration of the function

属性from rest_framework.permissions import AllowAny urlpatterns = [ path('docs/', include_docs_urls(title='Great Soft Uz', permission_classes=[AllowAny, ], authentication_classes=[])) ] 应为public Window() { this.DataContext = this; InitializeComponent(); } public string Name {get;} //xaml <TextBlock Text="{Binding Name}"/> Name

答案 6 :(得分:1)

我有类似的经历,Combobox上的ItemsSource绑定无效。

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

我只是忘了把列表变成一个属性:(

// NOPE:
public List<string> Versions;
// YEP:
public List<string> Versions { get; set; }

也许这可以帮助某人...

答案 7 :(得分:0)

查看Shahid的答案后,我发现我在DataContext事件中而不是在构造函数中将Loaded设置为引用。将其移至构造函数即可解决此问题。

答案 8 :(得分:-1)

我收到此错误,我的情况很简单,就像将要绑定的String设置为从私有到公共。

毫不留情地写我的支持领域。