2016-06-15 12 views
0

Ich habe die im Anschluss an diese XAML:Converter auf einem Get-only-Eigenschaft nicht (WPF) genannt

<ListBox Background="{Binding CurrentJob, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource JobToColorConverter}, Mode=TwoWay}"> 

Und ich möchte mein ListBox Hintergrund ändern in Abhängigkeit von der CurrentJob Eigenschaft. Hier ist ein Teil meines Code hinter:

private Job CurrentJob => ((FooClass) WindowsPanel.Children[0]).CurrentJob; 

Und hier ist mein (Dummy) -Konverter:

public class JobToColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var j = (Job) value; 
     return new SolidColorBrush(Color.FromArgb(100, 60, 116, 154)) 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

ich, dass die

nun überprüft, mein Problem ist, dass, wenn CurrentJob Änderung , kein Konvertierungsereignis wird ausgelöst und meine Convert-Methode wird nie aufgerufen.

Ich denke, das liegt daran, CurrentJob ist eine schreibgeschützte Eigenschaft, und so weiß das WPF-Framework nicht, wenn die Eigenschaft ändern. Das ist richtig?

+4

Sie müssen in Ihrer Klasse implementieren, um die 'INotifyPropertyChanged' Schnittstelle und stellen Sie sicher, dass ein' PropertyChanged' Ereignis wird ausgelöst, wenn Sie die Eigenschaft ändern. Der automatische Ausdruck mit '=>' Notation passt hier nicht. – dymanoid

+1

Darüber hinaus muss 'CurrentJob' für WPF-Datenbindung eine öffentliche Eigenschaft und kein privates Feld sein. – Clemens

Antwort

2

private Job CurrentJob; muss das Ereignis PropertyChanged ausgelöst werden. Inherit Ihre Klasse von INotifyPropertyChanged Schnittstelle und setzen es auf diese Weise:

public event PropertyChangedEventHandler PropertyChanged; 

protected void OnPropertyChanged(string name) 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 

    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(name)); 
    } 
} 


private Job currentJob; 

public Job CurrentJob 
{ 
    get { return curentJob; } 
    private set 
    { 
     if (this.currentJob != value) 
     { 
      this.currentJob = value; 
      OnPropertyChanged("CurrentJob"); 
     } 
    } 
} 
0

Ihr Eigentum ist privat, versuchen Sie, es öffentlich zu machen.

Da die Eigenschaft schreibgeschützt ist und keine Änderungen von ((FooClass) WindowsPanel.Children[0]).CurrentJob ausgibt, können Sie die bindende OneTime-Datei erstellen.