web-dev-qa-db-ja.com

WPFエラー40 BindingExpressionパスエラー:プロパティが「オブジェクト」で見つかりません

私はこのバインディングエラーで私の頭を叩いています。BindingExpressionパスエラーの投稿をいくつか確認しましたが、私の状況で機能するものは何も表示されません。

とにかく、IncrementingTextBoxというカスタムコントロールがあります。ユーザーが上のCheckBoxを「チェック」するたびに無効にしようとしています。

CheckBoxIsCheckedプロパティにバインディングがあり、正常に機能していて、想定どおりに起動しています。 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エラー:40:BindingExpressionパスエラー: 'ConfigurationModel'プロパティが 'object' '' IncrementingTextBox '(Name =' video_length_textbox ')'に見つかりません。 BindingExpression:Path = ConfigurationModel.DontUseSensorLength; DataItem = 'IncrementingTextBox'(Name = 'video_length_textbox');ターゲット要素は 'IncrementingTextBox'(Name = 'video_length_textbox');ターゲットプロパティは 'IsEnabled'(タイプ 'ブール')

「UseSensorLength」プロパティバインディングは正常に機能していますが、「DontUseSensorLength」バインディングは上記の「BindingExpressionパスエラー」を引き起こしていることに注意してください。

43
Curtis

私は最近、バインディングエラーの読み方について他のSO answer を書いたので、より意味があります。要約すると、コロンのエラーメッセージに改行を追加し、セミコロンを追加し、ボトムアップで読みます。

エラーメッセージは次のとおりです。

  • System.Windows.Dataエラー:40:
    • BindingExpressionパスエラー: 'ConfigurationModel'プロパティが 'object' '' IncrementingTextBox '(Name =' video_length_textbox ')'に見つかりません。
    • BindingExpression:Path = ConfigurationModel.DontUseSensorLength;
  • DataItem = 'IncrementingTextBox'(Name = 'video_length_textbox');
  • ターゲット要素は 'IncrementingTextBox'(Name = 'video_length_textbox');
  • ターゲットプロパティは 'IsEnabled'(タイプ 'ブール')

これは下から上へと読むことができます:

  • バインディングの失敗は、タイプIsEnabled(video_length_textboxという名前)の要素のIncrementingTextBoxプロパティです。

  • 要素のDataItemDataContext)は、video_length_textboxという名前のIncrementingTextBox型のオブジェクトです

  • 見つけようとしているバインディング式はConfigurationModel.DontUseSensorLength

  • バインディングの問題は、データコンテキストオブジェクトConfigurationModelIncrementingTextBoxプロパティが見つからないことです。

したがって、「video_length_textbox」のDataContextはそれ自体に設定され、IncrementingTextBoxクラスにはConfigurationModelというパブリックプロパティがありません。

XAMLのDataContextIncrementingTextBoxを設定していることがわかりませんので、IncrementingTextBoxクラスのコードを確認してください。最も可能性の高いケースは、コンストラクターでDataContextをそれ自体に設定していることです。

this.DataContext = this;

またはXAML

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

データを引き出していたオブジェクトのクラスが取得できなかったため、同じ問題が発生しました。および設定;そのプロパティに。

これは機能しませんでした:

public string Name;

しかし、これはうまくいきました:

public string Name{ get; set; }
62
Janiiik

確認することはほとんどありません

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を追加することを確認する場合

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

私は同じ問題を抱えていました。私の場合、boolの代わりにBooleanを使用していました。変更するとすぐに、期待どおりに機能します。

2
BlackM

このエラーは、XAMLプロパティ<ItemsSource>

ItemsSourceを正しい値で修正すると、XAMLはアイテムのコレクションを自動的にリライトしません。

したがって、ListBox UI-リスト表現を使用していたときに、プロパティでこれに直面しました:

enter image description here

コレクション内のすべてのアイテムを削除し、ItemSource値を修正することが重要でした。

2
Max Bender

同様の経験がありましたが、ComboboxのItemsSourceバインディングは機能しませんでした。

私の場合、それは小さな間違いでしたが、トレースメッセージを有効にするまで追跡するのは難しいものでした。

リストをプロパティに変えるのを忘れてしまいました:(

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

たぶんこれは誰かを助ける...

2
uceumern