2016-08-04 2 views
0

Я изменяю индикатор выполнения в зависимости от количества элементов в списке. Ниже код работает нормально.UpdateSourceTrigger не работает с конвертером

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

Но что мне действительно нужно не ProgressList.Count но ProgressList.Where(x => x.Done).Count() поэтому я изменил мой XAML, чтобы:

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

и сделал конвертер:

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(); 
    } 
} 

Но мне кажется, что UpdateSourceTrigger=PropertyChanged Безразлично» t, потому что он входит в мой конвертер только один раз (сразу после запуска приложения).

+1

'UpdateSourceTrigger' работает из' Target (View) '' To Source (VM'). –

ответ

1

Вы должны создать Property и обновить его от ViewModel и bind до progress bar. таким образом вы будете notify View, изменив свойство, связанное.

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

Теперь привязывание его к прогрессу бар и обновить свойство путем,

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

или добавить сеттер вашего списка Изменение при добавлении новых элементов.

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

Примечание: UpdateSourceTrigger работы от Target(View) К Source(VM)

+0

, поэтому вы предлагаете каждый раз, когда я нажимаю элемент в своем списке ProgressList, за ним следует «Progress = ProgressList.Where (x => x.Done) .Count();'? – Almis

+0

Да, так вы можете уведомить 'View' из' VM'. 'NotifyPropertyChanged();' в сеттере будет уведомлять ваш 'View' –

+0

. Я хотел бы что-то« автоматизированное », нет ли другого пути? – Almis

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