2016-05-23 13 views
0

So war es ein langer Tag herauszufinden, die besten Weg, um eine Eigenschaft verbindlich zu implementieren. Am Ende davon habe ich eine hail mary und gewonnen! ... aber ich weiß nicht warum. ein Fundamentalist zu sein, würde ich gerne wissen, warum diese Linie gearbeitet:C# MVVM WPF-Bindung an eine benutzerdefinierte verschachtelte Eigenschaft

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

in den folgenden Code-behind:

// 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; 
    } 
} 

und 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}" /> 

ich sicher gedacht das würde nur sagen, dass das Tag ein object ist und nichts anzeigt.

Antwort

0

Es ist einfach zu verstehen, wenn Sie es wissen.

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

Above Linie bedeutet, dass Sie auf eine Eigenschaft eines anderen Steuerelement mit dem Namen verbindlich comboRingBuffer und dem Namen der Eigenschaft zu suchen ist Tag.Format

Sie haben so in ViewModel/DataContextTagProperty von comboRingBuffer auf eine Eigenschaft binded FormatString sucht automatisch nach der Eigenschaft, die geblendet wurde.

+0

Aber es weiß, ist, dass das 'ComboBox' eine' Tag' hat, die eine 'object' sein sollte. Woher kannte es den Typ "Limit", der an die Eigenschaft gebunden war? – reasra

+0

was meinst du mit Limit? Ich schlage vor, Sie gehen durch [this] (http://Stackoverflow.com/a/7000922/2470362) und verstehen, wie der Konverter verwendet wird, um den Typ der Abhängigkeitseigenschaft zu entsprechen. In Ihrem Fall übergeben Sie den gleichen Typ an die Bindung, andernfalls kann es Fehler zur Laufzeit auslösen. –

0

Es gibt eine Art von Reflektion innerhalb der PropertyPath-Implementierung (Path-Eigenschaft der Binding-Klasse).

Der Wert, den Sie über XAML festlegen, wird als String, geparst und Reflektion behandelt.

Sie ein Tool verwenden, um die Implementierung dieser Klasse wie ILSpy oder andere zu überprüfen ..

+0

Nun, das stimmt, der XAML-Wert wird wie eine Zeichenfolge behandelt. Bemerkte, dass, als ich anfing, 'this.OnPropertyChanged (Name von (this.RingBufferPrefix));' et. al. Es öffnet nur eine ganze Dose Würmer, wenn ich Strukturen mit verschachtelten Eigenschaften in der * Ansicht * verwenden kann. – reasra

Verwandte Themen