2013-04-23 119 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}" > 
添加爲元素
相關問題