1

WPF と MVVM で使用する ViewModel クラスがあります。

public class ViewModel {

    /* Other members here... */

    public ReadOnlyObservableCollection<BackplaneViewModel> Backplanes {
        get { return _Backplanes; }
    }

    public BackplaneViewModel CurrentBackplane {
        get { 
            var cb = _CurrentBackplane ?? (_CurrentBackplane = Backplanes.First()); 
            return cb;
        }
        set { 
            if (_CurrentBackplane == value) return;
            _CurrentBackplane = value; 
            RaisePropertyChanged("CurrentBackplane");
        }
    }
}

_Backplanesコレクションはコンストラクターで作成および設定され、変更されることはありません。

ViewModelthis のインスタンスをとして使用するコントロールがありますDataContext。ユーザーは を選択できCurrentBackplaneますComboBox:

<ComboBox ItemsSource="{Binding Backplanes}"
          SelectedItem="{Binding CurrentBackplane}"
          DisplayMemberPath="BackplaneIndex" />

CurrentBackplaneコードも変更される場合があります。

の にブレークポイントを置きgetますCurrentBackplanecb変数がnull ではありません。WPFしかし、その値を要求した直後に、出力ウィンドウに次のように表示されます。

System.Windows.Data Information: 40 : BindingExpression path error: 'BackplaneIndex' property not found for 'object' because data item is null.  This could happen because the data provider has not produced any data yet. BindingExpression:Path=BackplaneIndex; DataItem=null; target element is 'ComboBox' (Name=''); target property is 'NoTarget' (type 'Object')
System.Windows.Data Information: 19 : BindingExpression cannot retrieve value due to missing information. BindingExpression:Path=BackplaneIndex; DataItem=null; target element is 'ComboBox' (Name=''); target property is 'NoTarget' (type 'Object')
System.Windows.Data Information: 20 : BindingExpression cannot retrieve value from null data item. This could happen when binding is detached or when binding to a Nullable type that has no value. BindingExpression:Path=BackplaneIndex; DataItem=null; target element is 'ComboBox' (Name=''); target property is 'NoTarget' (type 'Object')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=BackplaneIndex; DataItem=null; target element is 'ComboBox' (Name=''); target property is 'NoTarget' (type 'Object')

WPFデータ項目が null であると表示されるのはなぜですか?

何が間違っているのかわかりません。プログラムは実際には正常に動作しますが、この問題に関連していると思われるメモリ リークを追跡しようとしています。

4

5 に答える 5

0

これが答えかどうかはわかりませんが、試してみてください。アプリケーション セット内:

System.Diagnostics.PresentationTraceSources.DataBindingSource.Switch.Level = System.Diagnostics.SourceLevels.Critical;

これで問題が解決する場合があります。

于 2013-12-12T05:03:13.757 に答える
0

Joshの回答に加えて、セッターでpropertychangedを上げる必要があります

set { _CurrentBackplane = value; OnPropertyChanged("CurrentBackplane "); }

SelectedItem の Mode を TwoWay に設定する必要があります

SelectedItem="{Binding CurrentBackplane, Mode=TwoWay}"

ところで、バインディングエラーではなくバインディング情報を取得するだけです

于 2012-08-01T06:47:20.733 に答える
0

コンストラクターでコレクションの値をすぐに最初の値に設定し、getter コードを _CurrentBackplane を返すように変更した後、_CurrentBackplane を設定しようとしましたか?

_CurrentBackplane = Backplanes.First();  

public BackplaneViewModel CurrentBackplane {  
    get {   
        return _CurrentBackplane;  
    }  
    set { _CurrentBackplane = value; }  
}  
于 2012-07-31T20:29:07.703 に答える
0

ログが出力ウィンドウに書き込まれる前に、DataContext が実際に ViewModel インスタンスに設定されているかどうかを確認できますか? これを行うには、イベント ハンドラーを DataContextChanged イベントに接続します。

私のコードにも同様の問題が見られます。残念ながら、それを防ぐ方法はわかっていませんが、わかった場合はお知らせします。

于 2013-03-01T11:35:17.193 に答える