Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- element.AddHandler(CommandManager.PreviewCanExecuteEvent, new CanExecuteRoutedEventHandler(scope.CanExecutedHandler), true);
- <Window.Resources>
- <my:PermissionScope x:Key="permissionManager"/>
- </Window.Resources>
- <StackPanel>
- <TextBox Height="23" Name="textBox1" Width="120" />
- <Button Content="Permission Required" Command="{Binding Path=PermissionRequired}" my:PermissionScope.SharedPermissionScope="{StaticResource permissionManager}"/>
- <Button Content="Permission not required" Command="{Binding Path=PermissionRequired}"/>
- </StackPanel>
- public class PermissionScope
- {
- public static readonly DependencyProperty SharedPermissionScopeProperty =
- DependencyProperty.RegisterAttached("SharedPermissionScope", typeof(PermissionScope), typeof(PermissionScope),
- new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits,
- new PropertyChangedCallback(OnUseGlobalSharedPermissionScopeChanged)));
- public static void SetSharedPermissionScope(DependencyObject depObj, PermissionScope scope)
- {
- // never place logic in here, because these methods are not called when things are done in XAML
- depObj.SetValue(SharedPermissionScopeProperty, scope);
- }
- public static PermissionScope GetSharedPermissionScope(DependencyObject depObj)
- {
- // never place logic in here, because these methods are not called when things are done in XAML
- return depObj.GetValue(SharedPermissionScopeProperty) as PermissionScope;
- }
- private static void OnUseGlobalSharedPermissionScopeChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs args)
- {
- if (depObj is Button)
- {
- if (args.OldValue != null)
- {
- RemoveEventHandlers(depObj as UIElement, args.OldValue as PermissionScope);
- }
- if (args.NewValue != null)
- {
- AttachEventHandlers(depObj as UIElement, args.NewValue as PermissionScope);
- }
- }
- }
- private static void AttachEventHandlers(UIElement element, PermissionScope scope)
- {
- if (element != null && scope != null)
- {
- element.AddHandler(CommandManager.PreviewCanExecuteEvent, new CanExecuteRoutedEventHandler(scope.CanExecutedHandler), true); // we need to see all events to subvert the built-in undo/redo tracking in the text boxes
- }
- }
- private static void RemoveEventHandlers(UIElement element, PermissionScope scope)
- {
- if (element != null && scope != null)
- {
- element.AddHandler(CommandManager.PreviewCanExecuteEvent, new CanExecuteRoutedEventHandler(scope.CanExecutedHandler));
- }
- }
- private void CanExecutedHandler(object sender, CanExecuteRoutedEventArgs e)
- {
- if (e.Command is CommandBase)
- {
- bool hasPermission = false;
- hasPermission = ((CommandBase)e.Command).HasPermission();
- ShowControl((UIElement)e.OriginalSource, hasPermission);
- }
- }
- public static void ShowControl(UIElement element, bool show)
- {
- element.Visibility = show ? Visibility.Visible : Visibility.Collapsed;
- }
- }
Add Comment
Please, Sign In to add comment