4

私は xaml でバインドした親を持つ Node オブジェクトを持っています。

<Label>
    <Hyperlink>
        <TextBlock Text="{Binding Path=Node.Parent.Name}"/>
    </Hyperlink>
</Label>

私のViewModelは次のようになります

public class NodeViewModel
{
    public Node Node { get; set; }

    public NodeViewModel(Node model)
    {
        Node = model;
        if(model.Parent != null) { } // Check if it's null, then do nothing.
        // When the above line is commented out, my label displays nothing.
    }

}

if ステートメントをコメントアウトすると、ラベル/テキストブロックが空白になるのはなぜですか? 私は何か間違ったことをしていますか?オブジェクトが null かどうかを確認するまで、オブジェクトは存在し、存在しませんか?

編集:
言い忘れましたが、私のノード クラスは非常にシンプルでINotifyPropertyChanged、Name プロパティを実装しています。

2 番目の編集:私の単純な Node クラスを追加しました。

[ImplementPropertyChanged] // From Fody.PropertyChanged
public class Node
{
    public int? ParentID { get; set; }
    public Node Parent { get; set; }
    public string Name { get; set; }

    public Node Node(Node p = null)
    {
        Parent = p;
    }
}
4

2 に答える 2

3

コメントから:

実際にそうです。Entity Framework によってプロキシされます。それが問題でしょうか?もしそうなら、これを修正するハックの少ない方法はありますか?

問題が本当にプロキシにある場合は、そうではありません。プロキシ/ラッパー、WPF、および変更通知には本当に苦労するでしょう。

WPF のバインド エンジンはプロキシでは機能しません。まったく。まあ、それが本当によく書かれていて複雑でない限りは。だから、通常、決して。これは、INPC インターフェイスがどのように機能するかという事実から来ています。

void PropertyChanged(object sender, .... args)

WPF は と を追跡しsenderますBinding.Source。Binding の Source が "Z" というオブジェクト、つまりオブジェクト "A" のプロキシである場合、プロキシ "Z" によって WPF のエンジンに転送される "A" から発信された通知は破棄されます。 WPF の場合、「Z」はソースであり、アドバタイズされた送信者「A」と一致しません。

私はかなり長い間この問題と戦っていましたが、私が見つけた唯一の解決策は、プロキシに P-Changed イベントを変換さsender=Aせて、を に置き換えることですZ。これは、適切に記述されていないと、厄介なメモリ リークが発生する可能性があります。これは、デリゲートを新しいデリゲートに「マップ」し、両方の適切な破棄と GC を提供するのが難しいためです。通常、これは ie を使用して独自のプロキシを構築する場合にのみ可能です。キャッスルまたは同様の図書館。-replacement をすぐにサポートする動的プロキシ ライブラリは見つかりませんでした。sender

何かご存知でしたら教えてください!

とにかく、用語には注意してください。つまり、プロキシ。別の元のオブジェクト「A」に対する操作をラップおよびトリムまたは拡張するオブジェクト「Z」。ケースは異なる場合があります。いわゆる「プロキシ」がタイプの動的サブクラスであり、元のクラスにある仮想メソッド/プロパティ/イベントをオーバーライドする場合、それは私が意図したプロキシではありません。この場合、「プロキシ」と元のオブジェクトは同じオブジェクトです。クラス A として表示され、実際のクラスはZ:Aであり、WPF の場合、Sourcesender. 私の記憶が正しければ、これは EF がよく機能する方法です。

したがって、最初に確認することは、本当に犯人が誰であるかを調べることです。たぶんEFではなくFody?その魔法を取り除き、すべてのクラスでImplementPropertyChangedINPCを手動で実装してみてください。そして、私はすべてを意味します。Nodeと の両方NodeViewModel。怠惰な場合は、代わりにpropdp使用できDependencyPropertyます。動作する場合は、手動の INPC を削除して ie に置き換えてください。Fody'sのものです。物事が壊れ始めたら、すべての結果を収集して再分析します。

また、Fody の機能を確認してください。ある時点で透過的なプロキシ/ラッパーを提供する可能性がありますか?

編集:Fody'iedオブジェクトに「触れる」とコードが機能し始めることを考えると、Fodyを非難し始めます。たぶん、NodeViewModel.Nodeプロパティが現在 Fody によって追跡されていないためでしょうか? あなたもそれをマークしようとしImplementPropertyChangedましたか?これは純粋な推測であり、このライブラリにはいくつかの深刻な問題があることを意味しますが、迅速で試してみる価値があります。

于 2014-03-21T19:53:51.063 に答える
0

INPCでの実装が不足していると思いますViewModel。バインディングは、行ったUIときに更新されませんNode = node。セッターでproperty changedイベントを発生させます。Node

于 2014-03-21T19:37:03.420 に答える