2016-05-23 13 views
0

したがって、のベストプラクティスバインディングの実装方法はです。それまでに、私はhail maryウォンを投げた! ...しかし、私は理由を知らない。次のコードビハインドでc#カスタムネストされたプロパティへのMVVM WPFのバインド

FormatString="{Binding ElementName=comboRingBuffer, Path=Tag.Format}" 

を::

// Argument is a struct with a Limit "property" 
private Argument ringBuffer; 

public Limit RingBufferPrefix 
{ 
    get 
    { 
     return this.ringBuffer.Limit; 
    } 

    set 
    { 
     this.ringBuffer.Limit = value; 
     this.OnPropertyChanged(nameof(this.RingBufferPrefix)); 
    } 
} 

public class Limit 
{ 
    public Limit(string prefix, string format) 
    { 
     this.Prefix = prefix; 
     this.Format = format; 
    } 

    public string Prefix { get; set; } 
    public string Format { get; set; } 
    public override string ToString() 
    { 
     return this.Prefix; 
    } 
} 

およびXAML:私は確かに考え

<ComboBox x:Name="comboRingBuffer" 
      SelectionChanged="SelectionChanged_Event" 
      Tag="{Binding Path=RingBufferPrefix}" /> 
<xctk:IntegerUpDown x:Name="integerRingBuffer" 
        DockPanel.Dock="Right" 
        Style="{StaticResource DigitalInteger}" 
        ValueChanged="ValueChanged_Event" 
        FormatString="{Binding ElementName=comboRingBuffer, Path=Tag.Format}" 
        Value="{Binding Path=RingBuffer}" /> 

原理主義なので、私はこの行が働いた理由を知りたいのですがTagobjectであり、何も表示していないとだけ言います。

答えて

0

知っていれば分かりやすいです。線の上

"{Binding ElementName=comboRingBuffer, Path=Tag.Format}" 

あなたはcomboRingBufferという名前の別のコントロールのプロパティにバインドしていると見てプロパティの名前は、あなたがそうViewModel/DataContext内のプロパティにcomboRingBufferのTagPropertyをバインドされているTag.Format

であることを意味しFormatStringは自動的に盲目的な特性をチェックしています。

+0

.. ILSpyや他の人のように、このクラスの実装を確認するためのツールを使用することができます。しかし、それは知っているすべては 'ComboBox'は' object'あるべき 'Tag'を持っていることです。どのようにプロパティにバインドされていた 'Limit'型を知っていましたか? – reasra

+0

制限は何ですか?私はあなたが[this](http://stackoverflow.com/a/7000922/2470362)を見て、コンバータがどのように依存関係プロパティの種類にマッチするのかを理解することをお勧めします。あなたの場合は、同じ型をバインディングに渡しています。そうでないと、実行時にエラーが発生する可能性があります。 –

0

PropertyPath(BindingクラスのPathプロパティ)の実装には何らかの反射が起こっています。

XAMLから設定した値は、文字列、解析済みおよび反映として扱われます。

あなたは

+0

これは本当です.XAMLの値は文字列のように扱われます。私が 'this.OnPropertyChanged(nameof(this.RingBufferPrefix));'などを使用し始めたときに気づいた。 al。 * View *でネストされたプロパティを持つ構造体を使用することができれば、ワームの全体を開くことができます。 – reasra

関連する問題