我正在根据列表中的项目数更改进度条。下面的代码工作正常。
<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
不再触发,因为它只进入我的转换器一次(在运行应用程序后立即)。
答案 0 :(得分: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)