public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { eElementStateType state = (eElementStateType)value; Style answer = null; switch (state) { case eElementStateType.Exist: answer = Application.Current.FindResource("CellStackPanelDefaultStyle") as Style; break; case eElementStateType.Empty: answer = Application.Current.FindResource("CellStackPanelEmptytStyle") as Style; break; case eElementStateType.Add: answer = Application.Current.FindResource("CellStackPanelAddStyle") as Style; break; case eElementStateType.Delete: answer = Application.Current.FindResource("CellStackPanelDeleteStyle") as Style; break; case eElementStateType.CreateLink: answer = Application.Current.FindResource("CellStackPanelLinkStyle") as Style; break; default: break; } return(answer); }
/// <summary> /// Получить имена элементов в зависимости от объекта, типа эемента и состояния элемента /// </summary> /// <param name="splitterObjectType">Тип объекта</param> /// <param name="elementStates">Состояние элемента (можно несколько)</param> /// <param name="packageElementType">Тип элемента (можно несколько)</param> /// <returns></returns> private IEnumerable <string> GetNames(eSplitterObjectType splitterObjectType, eElementStateType elementStates, ePackageElementType packageElementType = ePackageElementType.Procedure | ePackageElementType.Function) { var x = Expr.Expression.Parameter(typeof(SplitterElement), "x"); var HasFlagMethod = typeof(Enum).GetMethod("HasFlag", new[] { typeof(Enum) }); var xPackageElementType = Expr.Expression.Convert(Expr.Expression.PropertyOrField(x, "PackageElementType"), typeof(Enum)); var xPackageElementTypeHasFlagExpression = Expr.Expression.Call(Expr.Expression.Constant(packageElementType, typeof(Enum)), HasFlagMethod, xPackageElementType); var xObjectType = Expr.Expression.Convert(Expr.Expression.PropertyOrField(x, splitterObjectType.ToString()), typeof(Enum)); var xObjectTypeHasFlagExpression = Expr.Expression.Call(Expr.Expression.Constant(elementStates, typeof(Enum)), HasFlagMethod, xObjectType); var FinalExpression = Expr.Expression.AndAlso(xPackageElementTypeHasFlagExpression, xObjectTypeHasFlagExpression); var Filter = (Func <SplitterElement, bool>)Expr.Expression.Lambda(FinalExpression, x).Compile(); Seri.Log.Verbose($"GetName Filter: {FinalExpression}"); /* Пример результата отбора * _splitter.Elements.Where(x => packageElementType.HasFlag(x.PackageElementType) && elementStates.HasFlag(x.NewSpec)); * где вместо x.NewSpec подставится поле в зависимости от splitterObjectType */ return(_splitter.Elements.Where(Filter).Select(x => x.PackageElementName)); }