/// <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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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();
 }