私はこのバインディングエラーで私の頭を叩いています。BindingExpression
パスエラーの投稿をいくつか確認しましたが、私の状況で機能するものは何も表示されません。
とにかく、IncrementingTextBox
というカスタムコントロールがあります。ユーザーが上のCheckBox
を「チェック」するたびに無効にしようとしています。
CheckBox
IsChecked
プロパティにバインディングがあり、正常に機能していて、想定どおりに起動しています。 ConfigurationModelのUseSensorLength
プロパティを正しく設定しています。
ただし、IncrementingTextBox
IsEnabled
プロパティのバインディングは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パスエラー」を引き起こしていることに注意してください。
私は最近、バインディングエラーの読み方について他のSO answer を書いたので、より意味があります。要約すると、コロンのエラーメッセージに改行を追加し、セミコロンを追加し、ボトムアップで読みます。
エラーメッセージは次のとおりです。
これは下から上へと読むことができます:
バインディングの失敗は、タイプIsEnabled
(video_length_textboxという名前)の要素のIncrementingTextBox
プロパティです。
要素のDataItem
(DataContext
)は、video_length_textboxという名前のIncrementingTextBox
型のオブジェクトです
見つけようとしているバインディング式はConfigurationModel.DontUseSensorLength
バインディングの問題は、データコンテキストオブジェクトConfigurationModel
にIncrementingTextBox
プロパティが見つからないことです。
したがって、「video_length_textbox」のDataContext
はそれ自体に設定され、IncrementingTextBox
クラスにはConfigurationModel
というパブリックプロパティがありません。
XAMLのDataContext
にIncrementingTextBox
を設定していることがわかりませんので、IncrementingTextBox
クラスのコードを確認してください。最も可能性の高いケースは、コンストラクターでDataContextをそれ自体に設定していることです。
this.DataContext = this;
またはXAML
DataContext="{Binding RelativeSource={RelativeSource Self}}"
データを引き出していたオブジェクトのクラスが取得できなかったため、同じ問題が発生しました。および設定;そのプロパティに。
これは機能しませんでした:
public string Name;
しかし、これはうまくいきました:
public string Name{ get; set; }
確認することはほとんどありません
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}" >
私は同じ問題を抱えていました。私の場合、bool
の代わりにBoolean
を使用していました。変更するとすぐに、期待どおりに機能します。
同様の経験がありましたが、ComboboxのItemsSourceバインディングは機能しませんでした。
私の場合、それは小さな間違いでしたが、トレースメッセージを有効にするまで追跡するのは難しいものでした。
リストをプロパティに変えるのを忘れてしまいました:(
// NOPE:
public List<string> Versions;
// YEP:
public List<string> Versions { get; set; }
たぶんこれは誰かを助ける...