سؤال

لدي مشكلة مع برنامج الأغذية العالمي برنامج.أحاول إنشاء كائن من شأنها أن تضيف معالجات إلى جميع الضوابط في نفس النطاق.

السطر التالي لا يعمل.هذا الحدث لم يتم التعامل معها.

element.AddHandler(CommandManager.PreviewCanExecuteEvent, new CanExecuteRoutedEventHandler(scope.CanExecutedHandler), true);

أنا أيضا أمر binded إلى الزر.لذا الفكرة التي أريد CanExecute من الأوامر لتشغيل:هذا يعمل بشكل جيد.أنا أيضا أريد معالج PreviewCanExecute:هذا لا يعمل.

أنا آسف لأني لا يمكن أن يفسر أي أفضل.

رؤية رمز أدناه:

XAML:

<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>

PermissionScope.cs

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;
    }
}

أنا حقا لا بعض المساعدة.

أطيب التحيات ، مايكل

هل كانت مفيدة؟

المحلول

اكتشفت نفسي.هذا سوف تعمل فقط مع RoutedCommands وليس ICommand

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top