/// <summary> /// Binds <see cref="Model"/> to <see cref="CheckBox"/> to select current row. /// </summary> /// <param name="model">The model of the DataSet.</param> /// <returns>The row binding object.</returns> public static RowBinding <CheckBox> BindToCheckBox(this Model model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } var trigger = new PropertyChangedTrigger <CheckBox>(CheckBox.IsCheckedProperty).WithAction(v => { var binding = (TwoWayBinding)v.GetBinding(); if (binding.IsRefreshing) { return; } var isChecked = v.IsChecked; if (!isChecked.HasValue) { return; } var isSelected = isChecked.GetValueOrDefault(); var row = v.GetRowPresenter(); row.IsSelected = isSelected; }); return(new RowBinding <CheckBox>( onRefresh: (v, p) => v.IsChecked = p.IsSelected, onSetup: (v, p) => trigger.Attach(v), onCleanup: (v, p) => trigger.Detach(v))); }
public void PropertyChangedTrigger_SetBindingValue_ValueChangedTwice() { StubDataStore dataStore = this.CreateDataStore(); PropertyChangedTrigger trigger = CreateTrigger <PropertyChangedTrigger>(dataStore, "Foo"); StubAction stubAction = CreateStubAction(); trigger.Actions.Add(stubAction); this.Test_SetBindingValue_ValueChangedTwice(trigger, stubAction, dataStore); }
public void SetProperty_GivenSimplePropertyFilter_WhenSecondOrderUnset_IgnoresNestedPropertyChange() { var secondOrder = GetSecondOrderObject(); var p = new PropertyChangedTrigger(secondOrder, "Child", null, _logger); bool triggered = false; p.Activate(null); // hook up the event after the first depth is set so that the trigger must come from next depth. p.Triggered += (sender, args) => { triggered = true; }; // unset the nested property secondOrder.Child.Child = null; Assert.IsFalse(triggered); }
public void SetProperty_GivenThirdOrderNesting_WhenThirdOrderSet_RaisesTriggeredEvent() { var thirdOrder = GetThirdOrderObject(); var p = new PropertyChangedTrigger(thirdOrder, "Child.Child.Child", null, _logger); bool triggered = false; int triggeredBy = -1; p.Triggered += (sender, args) => { triggeredBy = ((args.GetTripOrigin().Signal as BoundPropertyChangedEventArgs).PropertyOwner as NotifyPropertyChangedImpl).NestLevel; triggered = true; }; p.Activate(null); thirdOrder.Child.Child.Child = null; Assert.IsTrue(triggered); Assert.AreEqual(2, triggeredBy); }
public void SetProperty_GivenSimplePropertyFilter_WhenFirstOrdeSet_RaisesTriggeredEvent() { var firstOrder = new NotifyPropertyChangedImpl(0); var p = new PropertyChangedTrigger(firstOrder, "Child", null, _logger); bool triggered = false; int triggeredBy = -1; p.Triggered += (sender, args) => { triggeredBy = ((args.GetTripOrigin().Signal as BoundPropertyChangedEventArgs).PropertyOwner as NotifyPropertyChangedImpl).NestLevel; triggered = true; }; p.Activate(null); firstOrder.Child = new NotifyPropertyChangedImpl(1); Assert.IsTrue(triggered); Assert.AreEqual(0, triggeredBy); }
public override void Build(IActivityMachine machine) { var transportMachine = machine as TransportOperationMachine; if (transportMachine != null) { transportMachine.Instrument = machine.Configuration.Data.Instrument as IInstrument; transportMachine.Transport = machine.Configuration.Data.Transport as ITransport; transportMachine.Operation = machine.Configuration.Data.TransportOperation; transportMachine.Station = machine.Configuration.Data.Station as ITrayDetector; transportMachine.ExpirationTimespan = machine.Configuration.Data.ExpirationTimespan; // Assigning the tray at build time ensures that the stations are locked while also // letting the tray be used for runtime triggers. transportMachine.Tray = transportMachine.Station.Tray; var statefulSource = transportMachine.Station as IStatefulModel <StationState>; // Hold a reference to the transport's tray, if the station didn't have a tray. if (transportMachine.Tray == null) { transportMachine.Tray = transportMachine.Transport.Tray; } // Setup the triggers that each machine will use. if (transportMachine.Tray != null) { transportMachine.UseRuntimeTrigger(new PropertyChangedTrigger("Tray State Changed", transportMachine.Tray, transportMachine.Tray.PropertyToString(() => transportMachine.Tray.State))); } if (statefulSource != null) { transportMachine.UseRuntimeTrigger(new PropertyChangedTrigger("Station State Changed", statefulSource, statefulSource.PropertyToString(() => statefulSource.State))); } var stationTrayDetectTrigger = new PropertyChangedTrigger("Station IsTrayDetected Changed", statefulSource, transportMachine.Station.PropertyToString(() => transportMachine.Station.IsTrayDetected)); transportMachine.UseRuntimeTrigger(stationTrayDetectTrigger); var station = transportMachine.Station as IStation; if (station != null) { // This will trigger if either Error or Severity property notifies of a change. transportMachine.UseRuntimeTrigger(new PropertyChangedTrigger("Station Error Severity Changed", station, station.PropertyToString(() => station.Error) + "." + station.PropertyToString(() => station.Error.Severity))); } var transportTrayDetectTrigger = new PropertyChangedTrigger("Transportation IsTrayDetected Changed", transportMachine.Transport, transportMachine.Transport.PropertyToString(() => transportMachine.Transport.IsTrayDetected)); transportMachine.UseRuntimeTrigger(new PropertyChangedTrigger("Instrument State Changed", transportMachine.Instrument, transportMachine.Instrument.PropertyToString(() => transportMachine.Instrument.State))); transportMachine.UseRuntimeTrigger(new PropertyChangedTrigger("Transportation State Changed", transportMachine.Transport, transportMachine.Transport.PropertyToString(() => transportMachine.Transport.State))); transportMachine.UseRuntimeTrigger(transportTrayDetectTrigger); var transportStation = transportMachine.Transport as IStation; transportMachine.UseRuntimeTrigger(new PropertyChangedTrigger("Transportation HasErred Changed", transportStation, transportStation.PropertyToString(() => transportStation.HasErred))); transportMachine.UseRuntimeTrigger(new PropertyChangedTrigger("Transportation XPosition Changed", transportMachine.Transport, transportMachine.Transport.PropertyToString(() => transportMachine.Transport.XPosition))); transportMachine.UseRuntimeTrigger(new PropertyChangedTrigger("Transportation ZPosition Changed", transportMachine.Transport, transportMachine.Transport.PropertyToString(() => transportMachine.Transport.ZPosition))); // Tell the machine to quit acting if the tray is lost. transportMachine.SetQuitOnTrayState(TrayState.Lost); // Tell the machine to quit if Transport station has erred. transportMachine.SetQuitOnTransportHasErred(); // Tell the machine to quit if the source/dest (depending on move type) acquires a critical error. transportMachine.SetQuitOnCriticalStationError(); // Tell the machine to quit if the source/dest (depending on move type) goes to disabling or disabled state. transportMachine.SetQuitOnStationState(StationState.Disabling); transportMachine.SetQuitOnStationState(StationState.Disabled); // Tell machine to finish if transport is stopped. transportMachine.SetFinishOnTransportState(StationState.Stopped); switch (transportMachine.Operation) { case TransportOperation.BeginPickup: AssembleMachineForBeginTrayPickup(transportMachine); break; case TransportOperation.CompletePickup: AssembleMachineForCompleteTrayPickup(transportMachine, machine.Configuration.Data.SourceLockOwner); break; case TransportOperation.BeginDropoff: AssembleMachineForBeginTrayDropoff(transportMachine); break; case TransportOperation.CompleteDropoff: AssembleMachineForCompleteTrayDropoff(transportMachine); break; default: LogService.Log(LogType.System, LogMessageType.Warning, GetType().Name, "Attempted to build a TransportActivityMachine for an unknown purpose."); break; } } else { LogService.Log(LogType.System, LogMessageType.Error, GetType().Name, "Attempted to build a TransportActivityMachine using a null reference."); } }
private static ScalarBinding <T> ToSelectAll <T>(this DataPresenter dataPresenter) where T : ToggleButton, new() { if (dataPresenter == null) { throw new ArgumentNullException(nameof(dataPresenter)); } var trigger = new PropertyChangedTrigger <T>(ToggleButton.IsCheckedProperty).WithAction(v => { var binding = (TwoWayBinding)v.GetBinding(); if (binding.IsRefreshing) { return; } var isChecked = v.IsChecked; if (!isChecked.HasValue) { return; } var isSelected = isChecked.GetValueOrDefault(); var rows = dataPresenter.Rows; bool anyChange = false; for (int i = 0; i < rows.Count; i++) { var row = rows[i]; var oldValue = row.IsSelected; row.IsSelected = isSelected; if (row.IsSelected != oldValue) { anyChange = true; } } if (!anyChange) { dataPresenter.InvalidateView(); } }); return(new ScalarBinding <T>(onRefresh: v => { var selectedCount = dataPresenter.SelectedRows.Count; if (selectedCount == 0) { v.IsChecked = false; } else if (selectedCount == dataPresenter.Rows.Count - (dataPresenter.VirtualRow != null ? 1 : 0)) { v.IsChecked = true; } else { v.IsChecked = null; } }, onSetup: v => { trigger.Attach(v); }, onCleanup: v => { trigger.Detach(v); })); }
public void TearDown() { _objectWithProperty = null; _testee.Dispose(); _testee = null; }
public void SetUp() { _objectWithProperty = new Test(); _testee = new PropertyChangedTrigger(_objectWithProperty, "TestProperty"); _testee.MonitorEvents(); }