2016-05-23 4 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}" /> 

Я был уверен, это просто скажет, что Tag - это object и ничего не отображают.

ответ

0

Его просто понять, если вы знаете.

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

Выше линия означает, что вы привязку к свойству другого управления именем comboRingBuffer и имя свойства, чтобы смотреть это Tag.Format

Вы переплетены TagProperty из comboRingBuffer к свойству в ViewModel/DataContext так FormatString автоматически проверяет свойство, которое ослеплено.

+0

Но все это знает, что 'ComboBox' имеет' Tag', который должен быть 'object'. Как он знал тип 'Limit', который был связан с этим свойством? – reasra

+0

Что вы имели в виду под Limit? я предлагаю вам перейти через [this] (http://stackoverflow.com/a/7000922/2470362) и понять, как конвертер используется для соответствия типу свойства зависимостей. В вашем случае вы передаете один и тот же тип привязки, иначе он может вызывать ошибку во время выполнения. –

0

Существует какое-то отражение в свойствах PropertyPath (свойство Path для класса Binding).

Значение, заданное вами из XAML, рассматривается как строка, анализируется и отражается.

Вы можете использовать инструмент, чтобы проверить реализацию этого класса, как ILSpy или другие ..

+0

Ну, это правда, значение XAML обрабатывается как строка. Заметил, что когда я начал использовать 'this.OnPropertyChanged (nameof (this.RingBufferPrefix)),' et. и др. Он просто открывает целую банку червей, если я могу использовать структуры с вложенными свойствами в * View *. – reasra

Смежные вопросы