UpdateSourceTrigger无法使用转换器

时间:2016-08-04 20:56:04

标签: c# wpf

我正在根据列表中的项目数更改进度条。下面的代码工作正常。

<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不再触发,因为它只进入我的转换器一次(在运行应用程序后立即)。

1 个答案:

答案 0 :(得分:1)

您应该创建Property并将其从ViewModelbind更新为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)