2013-04-23 1 views
30

Sto sbattendo la testa sulla mia scrivania con questo errore di associazione .. Ho controllato diversi post per l'errore di percorso BindingExpression e non vedo nulla che funzioni con la mia situazione.Errore WPF 40 Errore percorso BindingExpression: proprietà non trovata su 'oggetto'

In ogni caso, ho un controllo personalizzato chiamato IncrementingTextBox. Sto provando a disabilitarlo ogni volta che l'utente "controlla" lo CheckBox sopra di esso.

Ho una associazione sulla proprietà CheckBoxIsChecked che funziona correttamente e sta funzionando quando è previsto. Imposta correttamente la proprietà UseSensorLength su ConfigurationModel.

Tuttavia, il binding sulla proprietà IncrementingTextBoxIsEnabled causa un errore di percorso BindingExpression e pertanto non si aggiorna affatto.

Come test, ho tentato nel codice dietro di abilitare e disabilitare il controllo e funziona perfettamente, ma non riesco a ottenere il binding su cui lavorare.

Ecco un frammento del mio 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"/> 

Ed ecco un frammento della mia ConfigurationModel:

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

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

Ecco il messaggio di errore che sto ottenendo nella mia finestra di uscita durante l'esecuzione del app:

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')

Ricordate, la proprietà 'UseSensorLength' vincolante sta lavorando bene, ma t Il collegamento "DontUseSensorLength" sta causando il precedente "errore del percorso di BindingExpression".

+1

Puoi pubblicare anche l'errore che hai ottenuto dalla finestra di output? –

+0

Ho aggiunto il testo del messaggio di errore alla pubblicazione sopra. – Curtis

+2

È necessario impostare DataContext in modo che rifletta il controllo utente corrente. Quando si crea l'associazione, viene visualizzato all'interno di DataContext di "IncrementingTextBox' per il valore' ConfigurationModel.DontUseSensorLength'. Devi usare un 'RelativeSource' simile a [this] (http://stackoverflow.com/a/11550721/1466627). –

risposta

83

Ho scritto qualche altro SO answer di recente su come leggere gli errori di binding in modo che abbiano più senso. Per riassumere, aggiungi interruzioni di riga al tuo messaggio di errore sui due punti e i punti e virgola e leggi dal basso verso l'alto.

Il tuo messaggio di errore è: Errore percorso

  • BindingExpression::

    • System.Windows.Data Errore: 40 proprietà 'ConfigurationModel' non trovato su 'oggetto' '' IncrementingTextBox'(Name = 'video_length_textbox')'.
    • BindingExpression: Path = ConfigurationModel.DontUseSensorLength;
  • DataItem = 'IncrementingTextBox' (Name = 'video_length_textbox');
  • l'elemento di destinazione è 'IncrementingTextBox' (Name = 'video_length_textbox');
  • proprietà target è 'IsEnabled' (tipo 'booleano')

Questo può essere letto dal basso verso l'alto come:

  • Il difetto di legame è la proprietà di un elemento di tipo IsEnabledIncrementingTextBox (denominato video_length_textbox).

  • Il DataItem (DataContext) dell'elemento è un oggetto di tipo IncrementingTextBox nome video_length_textbox

  • L'espressione vincolante che sta cercando di trovare è ConfigurationModel.DontUseSensorLength

  • E il problema l'associazione sta avendo è che la proprietà ConfigurationModel non si trova l'oggetto contesto dati IncrementingTextBox

Così il vostro DataContext per "video_length_textbox" è impostato a se stessa, e la classe IncrementingTextBox non dispone di una proprietà pubblica denominata ConfigurationModel

Dal momento che non vedo l'impostazione del DataContext per il vostro IncrementingTextBox ovunque nel vostro XAML, controlla la codice per la tua classe IncrementingTextBox. Il caso più probabile è che si sta impostando il DataContext a se stesso sia nel costruttore

this.DataContext = this; 

o il codice XAML

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

Rachel, sei un genio bellissimo !!! E io sono un idiota. Grazie mille per la soluzione. Ero legato a me stesso e non avevo una proprietà 'ConfigurationModel' nella mia classe IncrementingTextBox. Ancora una volta, grazie !!! Per qualche ragione, non riesco proprio a legare la mia testa a volte. Cerco di usarlo tutto il tempo, ma mi sembra di imbattermi in stupidi errori di Curtis su base regolare. Alla fine lo capirò .. – Curtis

+5

@Curtis Non preoccuparti, diventa facile una volta capito come funziona WPF. Potresti essere interessato a leggere un post sul blog per principianti che ho: [Cos'è questo "DataContext" di cui parli?] (Http://rachel53461.wordpress.com/2012/07/14/what-is-this-datacontext- si-parla-di /).Per riassumere, un'applicazione WPF ha due livelli: il livello dati ('DataContext') e uno strato UI. I collegamenti vengono utilizzati per estrarre i dati dal livello dati nel livello dell'interfaccia utente e il livello dell'interfaccia utente è in realtà solo un'interfaccia piuttosto user-friendly per il livello dati. Una volta che impari a mantenere separati questi livelli, diventa facile :) – Rachel

+1

Grazie @ Rachel, è stato molto utile! – Phasma

39

ho avuto lo stesso problema perché la classe di oggetto dal quale mi stava tirando fuori i dati didn' t avere; e impostare; sulle sue proprietà

questo non ha funzionato:

public string Name; 

ma questo ha funzionato:

public string Name{ get; set; } 
+2

Sì, non può essere un campo, deve essere una proprietà. Questo era esattamente il mio problema. – seabass2020

+0

Grazie, sono stato fuorviante da un tutorial. Deve essere una proprietà. –

+2

Ho avuto lo stesso problema e mi mancava l'accesso pubblico! A volte la soluzione è più facile di quanto sembri. – Korangar

0

Ho avuto lo stesso problema e nel mio caso stavo usando bool invece di Boolean. Non appena ho cambiato, funziona come previsto.

0

alcune cose da verificare

valori 1.segnare in proprietà prima InitializeComponent nel costruttore

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


    } 

    public double ScenarioHeight { get;set;} 

2.if sua un UserControl assicurarsi di aggiungere UserControl come elemento nel legame

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