2016-08-04 11 views
0

Ich ändere den Fortschrittsbalken basierend auf wie viele Elemente in der Liste sind. Der folgende Code funktioniert einwandfrei.UpdateSourceTrigger funktioniert nicht mit Konverter

<Controls:MetroProgressBar Minimum="0" Maximum="2" Value="{Binding ProgressList.Count, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"/> 

Aber was ich wirklich brauchen, ist nicht ProgressList.Count aber ProgressList.Where(x => x.Done).Count() so änderte ich meine XAML:

<Controls:MetroProgressBar Minimum="0" Maximum="2" Value="{Binding ProgressList, Converter={StaticResource DoneProgressConverter}, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"/> 

und einen Konverter:

public class DoneProgressConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((ObservableCollection<SetupProgress>)value).Where(x => x.Done).Count(); 
    } 

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

Aber es scheint, dass UpdateSourceTrigger=PropertyChanged doesn‘ t trigger mehr, weil es nur einmal in meinen Konverter kommt (unmittelbar nach dem Ausführen der Anwendung).

+1

'UpdateSourceTrigger' von' Target (Ansicht) arbeitet 'auf' Quelle (VM'). –

Antwort

1

Sie sollten ein Property erstellen und aktualisieren Sie es von Ihrem ViewModel und bind es zu Ihrem progress bar. Auf diese Weise werden Sie notify View durch Ändern der Eigenschaft binded.

private int _Progress; 
    public int Progress 
    { 
     get { return _Progress; } 
     set 
     { 
      _Progress= value;     
      NotifyPropertyChanged(); 
     } 
    } 

Jetzt ist es binden bar, um die Fortschritte und die Eigenschaft zu aktualisieren,

Progress = ProgressList.Where(x => x.Done).Count(); 

oder den Setter Ihrer Liste hinzufügen zu ändern, wenn Sie neue Elemente hinzuzufügen.

private ObservableCollection<yourClass>_ProgressList; 
    public ObservableCollection<yourClass> ProgressList 
    { 
     get { return _ProgressList; } 
     set 
     { 
      _ProgressList= value;     
      Progress = ProgressList.Where(x => x.Done).Count(); 
      NotifyPropertyChanged(); 
     } 
    }  

Hinweis: UpdateSourceTrigger Werke von Target(View) Um Source(VM)

+0

, also schlagen Sie vor, jedes Mal, wenn ich ein Element in meine ProgressList schiebe, sollte gefolgt von 'Progress = ProgressList.Where (x => x.Done) .Count();'? – Almis

+0

Ja, so können Sie 'View' von' VM' benachrichtigen. 'NotifyPropertyChanged();' im Setter wird Ihre 'View' melden. –

+0

Ich möchte etwas" automatisiertes ", gibt es keinen anderen Weg? – Almis