public SingleSelectionDescriptorBuilderBase( IVMDescriptor itemDescriptor, Func <TSourceObject, TItemSource, bool> isActiveFilter ) { WithProperties((d, b) => { var v = b.GetPropertyBuilder(); d.SelectedItem = v.VM.DelegatesTo( (vm) => vm.GetSelectedItem(), (vm, val) => vm.SetSelectedItem(val) ); d.AllItems = v .Collection .PopulatedWith(vm => { IEnumerable <TItemSource> selectableItems = SelectionHelpers .GetSelectableSourceItems <TSourceObject, TItemSource>(vm); return(selectableItems.Select(x => vm.GetItemVM(x))); }) .With(itemDescriptor); }); WithViewModelBehaviors(b => { b.OverrideUpdateFromSourceProperties( x => x.AllSourceItems, x => x.SelectedSourceItem, x => x.AllItems, x => x.SelectedItem ); b.OverrideUpdateSourceProperties( x => x.SelectedSourceItem ); b.AppendBehavior( new SelectionItemViewModelCacheBehavior <TItemSource, TItemVM>(itemDescriptor) ); b.PrependBehavior(new ItemProviderBehavior <TSourceObject, TItemSource>() { IsActiveFilter = isActiveFilter }); }); WithBehaviors(b => { b.Property(x => x.AllSourceItems).IsCached(); b.Property(x => x.SelectedItem).PrependBehavior(new SelectedItemRefreshBehavior <TItemVM>()); // TODO: Make this configurable. b.Property(x => x.SelectedSourceItem).RequiresLoadedProperty(x => x.AllSourceItems); }); WithValidators(b => { b.EnableParentValidation(x => x.SelectedItem); }); }
public MultiSelectionDescriptorBuilderBase( IVMDescriptor itemDescriptor, Func <TSourceObject, TItemSource, bool> isActiveFilter ) { WithProperties((d, b) => { var v = b.GetPropertyBuilder(); d.SelectedItems = v .Collection .Wraps(x => x.SelectedSourceItems) .With <TItemVM>(itemDescriptor); d.AllItems = v .Collection .PopulatedWith(vm => { IEnumerable <TItemSource> selectableItems = SelectionHelpers .GetSelectableSourceItems <TSourceObject, TItemSource>(vm); return(selectableItems.Select(x => vm.GetItemVM(x))); }) .With(itemDescriptor); }); WithViewModelBehaviors(b => { b.OverrideUpdateFromSourceProperties( x => x.AllSourceItems, x => x.SelectedSourceItems, x => x.AllItems, x => x.SelectedItems ); b.OverrideUpdateSourceProperties( x => x.SelectedSourceItems ); b.AppendBehavior( new SelectionItemViewModelCacheBehavior <TItemSource, TItemVM>(itemDescriptor) ); b.AppendBehavior(new ItemProviderBehavior <TSourceObject, TItemSource>() { IsActiveFilter = isActiveFilter }); }); WithBehaviors(b => { b.Property(x => x.SelectedItems).Enable( PropertyBehaviorKeys.ValueAccessor, new SelectedItemsAccessorBehavior <TVM, TItemVM, TItemSource>() ); // This behavior allows a bound comobox to assign a new list to the 'SelectedItems' // property every time the selection changes. b.Property(x => x.SelectedItems).Enable( PropertyBehaviorKeys.DisplayValueAccessor, new SettableListDisplayValueBehavior <TItemVM>() ); b.Property(x => x.SelectedItems).AddChangeHandler((vm, args) => { vm.RaisePropertyChangedForSelectedItems(); // HACK! }); b.Property(x => x.AllSourceItems).IsCached(); b.Property(x => x.SelectedItems).SupportsDisplayValueConversion(); b.Property(x => x.SelectedItems).PrependBehavior(new SelectedItemsRefreshBehavior <TItemVM>()); // TODO: Make this configurable. b.Property(x => x.SelectedSourceItems).RequiresLoadedProperty(x => x.AllSourceItems); }); WithValidators(b => { b.EnableParentValidation(x => x.SelectedItems); b.EnableParentViewModelValidation(); }); }